operatingsystem_windows.go 994 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. func GetOperatingSystem() (string, error) {
  9. var h syscall.Handle
  10. // Default return value
  11. ret := "Unknown Operating System"
  12. if err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE,
  13. syscall.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
  14. 0,
  15. syscall.KEY_READ,
  16. &h); err != nil {
  17. return ret, err
  18. }
  19. defer syscall.RegCloseKey(h)
  20. var buf [1 << 10]uint16
  21. var typ uint32
  22. n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
  23. if err := syscall.RegQueryValueEx(h,
  24. syscall.StringToUTF16Ptr("ProductName"),
  25. nil,
  26. &typ,
  27. (*byte)(unsafe.Pointer(&buf[0])),
  28. &n); err != nil {
  29. return ret, err
  30. }
  31. ret = syscall.UTF16ToString(buf[:])
  32. return ret, nil
  33. }
  34. // No-op on Windows
  35. func IsContainerized() (bool, error) {
  36. return false, nil
  37. }