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