aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/version
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-05-03 22:44:21 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-05-03 22:44:21 +0200
commit43d81aed6092b5ea2d82507c3099411690fa8687 (patch)
treee5141ec155967c53830b7a5e87986135df968b48 /version
parentfirewall: DNS is TCP and UDP (diff)
downloadwireguard-windows-43d81aed6092b5ea2d82507c3099411690fa8687.tar.xz
wireguard-windows-43d81aed6092b5ea2d82507c3099411690fa8687.zip
version: expose OsVersion for firewall
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'version')
-rw-r--r--version/os_windows.go51
-rw-r--r--version/zsyscall_windows.go12
2 files changed, 37 insertions, 26 deletions
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
}