diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-10-19 16:55:05 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-10-20 01:15:24 -0600 |
commit | 059de1cb025f2d4eb4ed15fce5218b978a080447 (patch) | |
tree | 9c0b43798bf630c6a35857b74a490a65eb6e9f8e | |
parent | manager: warn about dnscache and old virtio driver (diff) | |
download | wireguard-windows-059de1cb025f2d4eb4ed15fce5218b978a080447.tar.xz wireguard-windows-059de1cb025f2d4eb4ed15fce5218b978a080447.zip |
ui: show driver version in about page
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | driver/dll_fromfile_windows.go | 2 | ||||
-rw-r--r-- | driver/dll_fromrsrc_windows.go | 2 | ||||
-rw-r--r-- | driver/memmod/memmod_windows.go | 4 | ||||
-rw-r--r-- | driver/version_windows.go | 61 | ||||
-rw-r--r-- | ui/aboutdialog.go | 3 |
5 files changed, 71 insertions, 1 deletions
diff --git a/driver/dll_fromfile_windows.go b/driver/dll_fromfile_windows.go index bda0d7db..b815b4c0 100644 --- a/driver/dll_fromfile_windows.go +++ b/driver/dll_fromfile_windows.go @@ -18,6 +18,7 @@ import ( type lazyDLL struct { Name string + Base windows.Handle mu sync.Mutex module windows.Handle onLoad func(d *lazyDLL) @@ -41,6 +42,7 @@ func (d *lazyDLL) Load() error { if err != nil { return fmt.Errorf("Unable to load library: %w", err) } + d.Base = module atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module)) if d.onLoad != nil { diff --git a/driver/dll_fromrsrc_windows.go b/driver/dll_fromrsrc_windows.go index 560848fe..65b1cfce 100644 --- a/driver/dll_fromrsrc_windows.go +++ b/driver/dll_fromrsrc_windows.go @@ -19,6 +19,7 @@ import ( type lazyDLL struct { Name string + Base windows.Handle mu sync.Mutex module *memmod.Module onLoad func(d *lazyDLL) @@ -47,6 +48,7 @@ func (d *lazyDLL) Load() error { if err != nil { return fmt.Errorf("Unable to load library: %w", err) } + d.Base = windows.Handle(module.BaseAddr()) atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module)) if d.onLoad != nil { diff --git a/driver/memmod/memmod_windows.go b/driver/memmod/memmod_windows.go index da6ff9af..5ded40ea 100644 --- a/driver/memmod/memmod_windows.go +++ b/driver/memmod/memmod_windows.go @@ -39,6 +39,10 @@ type Module struct { blockedMemory *addressList } +func (module *Module) BaseAddr() uintptr { + return module.codeBase +} + func (module *Module) headerDirectory(idx int) *IMAGE_DATA_DIRECTORY { return &module.headers.OptionalHeader.DataDirectory[idx] } diff --git a/driver/version_windows.go b/driver/version_windows.go new file mode 100644 index 00000000..dadd8087 --- /dev/null +++ b/driver/version_windows.go @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved. + */ + +package driver + +import ( + "fmt" + "unsafe" + + "golang.org/x/sys/windows" +) + +/* TODO: put this into x/sys/windows */ +var verQueryValue = windows.NewLazySystemDLL("version.dll").NewProc("VerQueryValueW") + +type VS_FIXEDFILEINFO struct { + Signature uint32 + StrucVersion uint32 + FileVersionMS uint32 + FileVersionLS uint32 + ProductVersionMS uint32 + ProductVersionLS uint32 + FileFlagsMask uint32 + FileFlags uint32 + FileOS uint32 + FileType uint32 + FileSubtype uint32 + FileDateMS uint32 + FileDateLS uint32 +} + +func Version() string { + if modwireguard.Load() != nil { + return "unknown" + } + resInfo, err := windows.FindResource(modwireguard.Base, windows.ResourceID(1), windows.RT_VERSION) + if err != nil { + return "unknown" + } + data, err := windows.LoadResourceData(modwireguard.Base, resInfo) + if err != nil { + return "unknown" + } + + var fixedInfo *VS_FIXEDFILEINFO + fixedInfoLen := uint32(unsafe.Sizeof(*fixedInfo)) + ret, _, _ := verQueryValue.Call(uintptr(unsafe.Pointer(&data[0])), uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(`\`))), uintptr(unsafe.Pointer(&fixedInfo)), uintptr(unsafe.Pointer(&fixedInfoLen))) + if ret == 0 { + return "unknown" + } + version := fmt.Sprintf("%d.%d", (fixedInfo.FileVersionMS>>16)&0xff, (fixedInfo.FileVersionMS>>0)&0xff) + if nextNibble := (fixedInfo.FileVersionLS >> 16) & 0xff; nextNibble != 0 { + version += fmt.Sprintf(".%d", nextNibble) + } + if nextNibble := (fixedInfo.FileVersionLS >> 0) & 0xff; nextNibble != 0 { + version += fmt.Sprintf(".%d", nextNibble) + } + return version +} diff --git a/ui/aboutdialog.go b/ui/aboutdialog.go index eaeed96c..aaf909ae 100644 --- a/ui/aboutdialog.go +++ b/ui/aboutdialog.go @@ -12,6 +12,7 @@ import ( "github.com/lxn/walk" "github.com/lxn/win" "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/driver" "golang.zx2c4.com/wireguard/windows/l18n" "golang.zx2c4.com/wireguard/windows/version" @@ -95,7 +96,7 @@ func runAboutDialog(owner walk.Form) error { return err } detailsLbl.SetTextAlignment(walk.AlignHCenterVNear) - detailsLbl.SetText(l18n.Sprintf("App version: %s\nGo version: %s-%s\nOperating system: %s\nArchitecture: %s", version.Number, strings.TrimPrefix(runtime.Version(), "go"), runtime.GOARCH, version.OsName(), version.Arch())) + detailsLbl.SetText(l18n.Sprintf("App version: %s\nDriver version: %s\nGo version: %s-%s\nOperating system: %s\nArchitecture: %s", version.Number, driver.Version(), strings.TrimPrefix(runtime.Version(), "go"), runtime.GOARCH, version.OsName(), version.Arch())) copyrightLbl, err := walk.NewTextLabel(showingAboutDialog) if err != nil { |