operatingsystem_windows.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package operatingsystem
  2. import (
  3. "syscall"
  4. "unsafe"
  5. )
  6. // See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c
  7. // for a similar sample
  8. // GetOperatingSystem gets the name of the current operating system.
  9. func GetOperatingSystem() (string, error) {
  10. var h syscall.Handle
  11. // Default return value
  12. ret := "Unknown Operating System"
  13. if err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE,
  14. syscall.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
  15. 0,
  16. syscall.KEY_READ,
  17. &h); err != nil {
  18. return ret, err
  19. }
  20. defer syscall.RegCloseKey(h)
  21. var buf [1 << 10]uint16
  22. var typ uint32
  23. n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
  24. if err := syscall.RegQueryValueEx(h,
  25. syscall.StringToUTF16Ptr("ProductName"),
  26. nil,
  27. &typ,
  28. (*byte)(unsafe.Pointer(&buf[0])),
  29. &n); err != nil {
  30. return ret, err
  31. }
  32. ret = syscall.UTF16ToString(buf[:])
  33. return ret, nil
  34. }
  35. // IsContainerized returns true if we are running inside a container.
  36. // No-op on Windows, always returns false.
  37. func IsContainerized() (bool, error) {
  38. return false, nil
  39. }