From c85e4a410f27986a2967a49c0155633c716bf3ca Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Fri, 5 Apr 2019 02:26:40 -0400 Subject: 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] --- tun/wintun/wintun_windows.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 -- cgit v1.2.3