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