From: Jason A. Donenfeld Date: Fri, 10 May 2019 15:34:03 +0000 (+0200) Subject: wintun: poll for device key X-Git-Tag: 0.0.20190517~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1bf1dadf15d04aae6b309abf1d2cdebadb81418c;p=thirdparty%2Fwireguard-go.git wintun: poll for device key It's actually pretty hard to guess where it is. --- diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go index 23b09d1..a73f5f2 100644 --- a/tun/wintun/wintun_windows.go +++ b/tun/wintun/wintun_windows.go @@ -294,13 +294,16 @@ func CreateInterface(description string, hwndParent uintptr) (*Wintun, bool, err // DIF_INSTALLDEVICE returns almost immediately, while the device installation // continues in the background. It might take a while, before all registry // keys and values are populated. - - // Wait for device registry key to emerge and populate. - key, err = registryEx.OpenKeyWait( - registry.LOCAL_MACHINE, - fmt.Sprintf("SYSTEM\\CurrentControlSet\\Control\\Class\\%v\\%04d", guid.ToString(&deviceClassNetGUID), deviceData.DevInst), - registry.QUERY_VALUE|registryEx.KEY_NOTIFY, - waitForRegistryTimeout) + const pollTimeout = time.Millisecond * 50 + for i := 0; i < int(waitForRegistryTimeout/pollTimeout); i++ { + if i != 0 { + time.Sleep(pollTimeout) + } + key, err = devInfoList.OpenDevRegKey(deviceData, setupapi.DICS_FLAG_GLOBAL, 0, setupapi.DIREG_DRV, registry.QUERY_VALUE|registryEx.KEY_NOTIFY) + if err == nil { + break + } + } if err == nil { _, err = registryEx.GetStringValueWait(key, "NetCfgInstanceId", waitForRegistryTimeout) if err == nil { @@ -311,8 +314,6 @@ func CreateInterface(description string, hwndParent uintptr) (*Wintun, bool, err } key.Close() } - // Clear error and let makeWintun() open the key using SetupAPI's devInfoList.OpenDevRegKey(). - err = nil } if err == nil {