]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
wintun: poll for device key
authorJason A. Donenfeld <Jason@zx2c4.com>
Fri, 10 May 2019 15:34:03 +0000 (17:34 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 10 May 2019 15:34:03 +0000 (17:34 +0200)
It's actually pretty hard to guess where it is.

tun/wintun/wintun_windows.go

index 23b09d1d0f7aa6b5e0b8993568e6678603015398..a73f5f2756c68eb647568293b7f46774ee658996 100644 (file)
@@ -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 {