kernel_windows.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package kernel // import "github.com/docker/docker/pkg/parsers/kernel"
  2. import (
  3. "fmt"
  4. "golang.org/x/sys/windows"
  5. "golang.org/x/sys/windows/registry"
  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. KVI := &VersionInfo{"Unknown", 0, 0, 0}
  20. k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
  21. if err != nil {
  22. return KVI, err
  23. }
  24. defer k.Close()
  25. blex, _, err := k.GetStringValue("BuildLabEx")
  26. if err != nil {
  27. return KVI, err
  28. }
  29. KVI.kvi = blex
  30. // Important - dockerd.exe MUST be manifested for this API to return
  31. // the correct information.
  32. dwVersion, err := windows.GetVersion()
  33. if err != nil {
  34. return KVI, err
  35. }
  36. KVI.major = int(dwVersion & 0xFF)
  37. KVI.minor = int((dwVersion & 0xFF00) >> 8)
  38. KVI.build = int((dwVersion & 0xFFFF0000) >> 16)
  39. return KVI, nil
  40. }