aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--driver/dll_fromfile_windows.go2
-rw-r--r--driver/dll_fromrsrc_windows.go2
-rw-r--r--driver/memmod/memmod_windows.go4
-rw-r--r--driver/version_windows.go61
-rw-r--r--ui/aboutdialog.go3
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 {