From 4613315ec918c4626c0ac4870df4c828c1a9566e Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 3 May 2019 22:44:21 +0200 Subject: version: expose OsVersion for firewall --- version/os_windows.go | 51 +++++++++++++++++++++++++-------------------- version/zsyscall_windows.go | 12 ++++++++--- 2 files changed, 37 insertions(+), 26 deletions(-) (limited to 'version') diff --git a/version/os_windows.go b/version/os_windows.go index ac4e8957..81147ea5 100644 --- a/version/os_windows.go +++ b/version/os_windows.go @@ -10,34 +10,39 @@ import ( "unsafe" ) -type osVersionInfo struct { +type OsVersionInfo struct { osVersionInfoSize uint32 - majorVersion uint32 - minorVersion uint32 - buildNumber uint32 - platformId uint32 - csdVersion [128]uint16 - servicePackMajor uint16 - servicePackMinor uint16 - suiteMask uint16 - productType byte + MajorVersion uint32 + MinorVersion uint32 + BuildNumber uint32 + PlatformId uint32 + CsdVersion [128]uint16 + ServicePackMajor uint16 + ServicePackMinor uint16 + SuiteMask uint16 + ProductType byte reserved byte } -//sys rtlGetVersion(versionInfo *osVersionInfo) (nterr uint32) = ntdll.RtlGetVersion +//sys rtlGetVersion(versionInfo *OsVersionInfo) (err error) [failretval!=0] = ntdll.RtlGetVersion + +func OsVersion() (versionInfo OsVersionInfo, err error) { + versionInfo.osVersionInfoSize = uint32(unsafe.Sizeof(versionInfo)) + err = rtlGetVersion(&versionInfo) + return +} func OsName() string { - windowsVersion := "Windows Unknown" - versionInfo := &osVersionInfo{osVersionInfoSize: uint32(unsafe.Sizeof(osVersionInfo{}))} - if rtlGetVersion(versionInfo) == 0 { - winType := "" - switch versionInfo.productType { - case 3: - winType = " Server" - case 2: - winType = " Controller" - } - windowsVersion = fmt.Sprintf("Windows%s %d.%d.%d", winType, versionInfo.majorVersion, versionInfo.minorVersion, versionInfo.buildNumber) + versionInfo, err := OsVersion() + if err != nil { + return "Windows Unknown" + } + winType := "" + switch versionInfo.ProductType { + case 3: + winType = " Server" + case 2: + winType = " Controller" } - return windowsVersion + return fmt.Sprintf("Windows%s %d.%d.%d", winType, versionInfo.MajorVersion, versionInfo.MinorVersion, versionInfo.BuildNumber) } diff --git a/version/zsyscall_windows.go b/version/zsyscall_windows.go index ef4e11d7..711d76da 100644 --- a/version/zsyscall_windows.go +++ b/version/zsyscall_windows.go @@ -46,9 +46,15 @@ var ( procVerQueryValueW = modversion.NewProc("VerQueryValueW") ) -func rtlGetVersion(versionInfo *osVersionInfo) (nterr uint32) { - r0, _, _ := syscall.Syscall(procRtlGetVersion.Addr(), 1, uintptr(unsafe.Pointer(versionInfo)), 0, 0) - nterr = uint32(r0) +func rtlGetVersion(versionInfo *OsVersionInfo) (err error) { + r1, _, e1 := syscall.Syscall(procRtlGetVersion.Addr(), 1, uintptr(unsafe.Pointer(versionInfo)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } return } -- cgit v1.2.3-59-g8ed1b