From 1f146a5e7ad9081c79026339c2ad82f357743d66 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 8 Oct 2019 09:58:58 +0200 Subject: [PATCH] wintun: expose version --- tun/tun_windows.go | 5 +++++ tun/wintun/wintun_windows.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/tun/tun_windows.go b/tun/tun_windows.go index 6a603a3..4b5da02 100644 --- a/tun/tun_windows.go +++ b/tun/tun_windows.go @@ -244,6 +244,11 @@ func (tun *NativeTun) LUID() uint64 { return tun.wt.LUID() } +// Version returns the version of the Wintun driver and NDIS system currently loaded. +func (tun *NativeTun) Version() (driverVersion string, ndisVersion string, err error) { + return tun.wt.Version() +} + func (rate *rateJuggler) update(packetLen uint64) { now := nanotime() total := atomic.AddUint64(&rate.nextByteCount, packetLen) diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go index e2348c0..e6dc141 100644 --- a/tun/wintun/wintun_windows.go +++ b/tun/wintun/wintun_windows.go @@ -671,11 +671,39 @@ func (wintun *Interface) tcpipAdapterRegKeyName() string { return fmt.Sprintf("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters\\%v", wintun.cfgInstanceID) } -// deviceRegKeyName returns the device-level registry key name +// deviceRegKeyName returns the device-level registry key name. func (wintun *Interface) deviceRegKeyName() string { return fmt.Sprintf("SYSTEM\\CurrentControlSet\\Enum\\%v", wintun.devInstanceID) } +// Version returns the version of the Wintun driver and NDIS system currently loaded. +func (wintun *Interface) Version() (driverVersion string, ndisVersion string, err error) { + key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Wintun", registry.QUERY_VALUE) + if err != nil { + return + } + defer key.Close() + driverMajor, _, err := key.GetIntegerValue("DriverMajorVersion") + if err != nil { + return + } + driverMinor, _, err := key.GetIntegerValue("DriverMinorVersion") + if err != nil { + return + } + ndisMajor, _, err := key.GetIntegerValue("NdisMajorVersion") + if err != nil { + return + } + ndisMinor, _, err := key.GetIntegerValue("NdisMinorVersion") + if err != nil { + return + } + driverVersion = fmt.Sprintf("%d.%d", driverMajor, driverMinor) + ndisVersion = fmt.Sprintf("%d.%d", ndisMajor, ndisMinor) + return +} + // tcpipInterfaceRegKeyName returns the interface-specific TCP/IP network registry key name. func (wintun *Interface) tcpipInterfaceRegKeyName() (path string, err error) { key, err := registry.OpenKey(registry.LOCAL_MACHINE, wintun.tcpipAdapterRegKeyName(), registry.QUERY_VALUE)