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