kernel_windows.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package kernel
  2. import (
  3. "fmt"
  4. "unsafe"
  5. "golang.org/x/sys/windows"
  6. )
  7. // VersionInfo holds information about the kernel.
  8. type VersionInfo struct {
  9. kvi string // Version of the kernel (e.g. 6.1.7601.17592 -> 6)
  10. major int // Major part of the kernel version (e.g. 6.1.7601.17592 -> 1)
  11. minor int // Minor part of the kernel version (e.g. 6.1.7601.17592 -> 7601)
  12. build int // Build number of the kernel version (e.g. 6.1.7601.17592 -> 17592)
  13. }
  14. func (k *VersionInfo) String() string {
  15. return fmt.Sprintf("%d.%d %d (%s)", k.major, k.minor, k.build, k.kvi)
  16. }
  17. // GetKernelVersion gets the current kernel version.
  18. func GetKernelVersion() (*VersionInfo, error) {
  19. var (
  20. h windows.Handle
  21. dwVersion uint32
  22. err error
  23. )
  24. KVI := &VersionInfo{"Unknown", 0, 0, 0}
  25. if err = windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
  26. windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
  27. 0,
  28. windows.KEY_READ,
  29. &h); err != nil {
  30. return KVI, err
  31. }
  32. defer windows.RegCloseKey(h)
  33. var buf [1 << 10]uint16
  34. var typ uint32
  35. n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
  36. if err = windows.RegQueryValueEx(h,
  37. windows.StringToUTF16Ptr("BuildLabEx"),
  38. nil,
  39. &typ,
  40. (*byte)(unsafe.Pointer(&buf[0])),
  41. &n); err != nil {
  42. return KVI, err
  43. }
  44. KVI.kvi = windows.UTF16ToString(buf[:])
  45. // Important - docker.exe MUST be manifested for this API to return
  46. // the correct information.
  47. if dwVersion, err = windows.GetVersion(); err != nil {
  48. return KVI, err
  49. }
  50. KVI.major = int(dwVersion & 0xFF)
  51. KVI.minor = int((dwVersion & 0XFF00) >> 8)
  52. KVI.build = int((dwVersion & 0xFFFF0000) >> 16)
  53. return KVI, nil
  54. }