From: Jason A. Donenfeld Date: Thu, 18 Jul 2019 08:25:12 +0000 (+0200) Subject: wintun: calculate path of NDIS device object symbolic link X-Git-Tag: 0.0.20190805~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=298d759f3efba6b90ea70838d190959b39c5be57;p=thirdparty%2Fwireguard-go.git wintun: calculate path of NDIS device object symbolic link --- diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go index b8aabf3..160d51f 100644 --- a/tun/wintun/wintun_windows.go +++ b/tun/wintun/wintun_windows.go @@ -311,6 +311,9 @@ func CreateInterface(description string, requestedGUID *windows.GUID) (wintun *W waitForRegistryTimeout) if err == nil { _, err = registryEx.GetStringValueWait(key, "Name", waitForRegistryTimeout) + if err == nil { + _, err = registryEx.GetStringValueWait(key, "PnPInstanceId", waitForRegistryTimeout) + } key.Close() } } @@ -614,6 +617,23 @@ func (wintun *Wintun) DataFileName() string { return fmt.Sprintf("\\\\.\\Global\\WINTUN%d", wintun.luidIndex) } +// NdisFileName returns the Wintun NDIS device object name. +func (wintun *Wintun) NdisFileName() (string, error) { + key, err := registry.OpenKey(registry.LOCAL_MACHINE, wintun.netRegKeyName(), registry.QUERY_VALUE) + if err != nil { + return "", fmt.Errorf("Network-specific registry key open failed: %v", err) + } + defer key.Close() + + // Get the interface name. + pnpInstanceID, err := registryEx.GetStringValue(key, "PnPInstanceId") + if err != nil { + return "", fmt.Errorf("PnpInstanceId registry key read failed: %v", err) + } + mangledPnpNode := strings.ReplaceAll(fmt.Sprintf("%s\\{cac88484-7515-4c03-82e6-71a87abac361}", pnpInstanceID), "\\", "#") + return fmt.Sprintf("\\\\.\\Global\\%s", mangledPnpNode), nil +} + // GUID returns the GUID of the interface. func (wintun *Wintun) GUID() windows.GUID { return wintun.cfgInstanceID