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