From: Avery Pennarun Date: Fri, 5 Apr 2019 06:26:40 +0000 (-0400) Subject: wintun: quickly ignore non-Wintun devices X-Git-Tag: 0.0.20200121~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c85e4a410f27986a2967a49c0155633c716bf3ca;p=thirdparty%2Fwireguard-go.git wintun: quickly ignore non-Wintun devices Some devices take ~2 seconds to enumerate on Windows if we try to get their instance name. The hardware id property, on the other hand, is available right away. Signed-off-by: Avery Pennarun [zx2c4: inlined this to where it makes sense, reused setupapi const] --- diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go index e6dc141..a49242f 100644 --- a/tun/wintun/wintun_windows.go +++ b/tun/wintun/wintun_windows.go @@ -131,6 +131,15 @@ func (pool Pool) GetInterface(ifname string) (*Interface, error) { continue } + // Check the Hardware ID to make sure it's a real Wintun device first. This avoids doing slow operations on non-Wintun devices. + property, err := devInfoList.DeviceRegistryProperty(deviceData, setupapi.SPDRP_HARDWAREID) + if err != nil { + continue + } + if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID { + continue + } + wintun, err := makeWintun(devInfoList, deviceData, pool) if err != nil { continue @@ -494,6 +503,15 @@ func (pool Pool) DeleteMatchingInterfaces(matches func(wintun *Interface) bool) continue } + // Check the Hardware ID to make sure it's a real Wintun device first. This avoids doing slow operations on non-Wintun devices. + property, err := devInfoList.DeviceRegistryProperty(deviceData, setupapi.SPDRP_HARDWAREID) + if err != nil { + continue + } + if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID { + continue + } + err = devInfoList.BuildDriverInfoList(deviceData, setupapi.SPDIT_COMPATDRIVER) if err != nil { continue