wintun: make remaining HWID comparisons case insensitive
c85e4a410f
introduced preliminary HWID
checking to speed up Wintun adapter enumeration. However, all HWID are
case insensitive by Windows convention.
Furthermore, a device might have multiple HWIDs. When DevInfo's
DeviceRegistryProperty(SPDRP_HARDWAREID) method returns []string, all
strings returned should be checked against given hardware ID.
This issue was discovered when researching Wintun and wireguard-go on
Windows 10 ARM64. The Wintun adapter was created using devcon.exe
utility with "wintun" hardware ID, causing wireguard-go fail to
enumerate the adapter properly.
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
250b9795f3
commit
fdba6c183a
|
@ -136,7 +136,7 @@ func (pool Pool) GetInterface(ifname string) (*Interface, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID {
|
if !isOurHardwareID(property) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +508,7 @@ func (pool Pool) DeleteMatchingInterfaces(matches func(wintun *Interface) bool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID {
|
if !isOurHardwareID(property) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,3 +801,20 @@ func (wintun *Interface) GUID() windows.GUID {
|
||||||
func (wintun *Interface) LUID() uint64 {
|
func (wintun *Interface) LUID() uint64 {
|
||||||
return ((uint64(wintun.luidIndex) & ((1 << 24) - 1)) << 24) | ((uint64(wintun.ifType) & ((1 << 16) - 1)) << 48)
|
return ((uint64(wintun.luidIndex) & ((1 << 24) - 1)) << 24) | ((uint64(wintun.ifType) & ((1 << 16) - 1)) << 48)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isOurHardwareID(property interface{}) bool {
|
||||||
|
hwidLC := strings.ToLower(hardwareID)
|
||||||
|
|
||||||
|
if hwids, ok := property.([]string); ok && len(hwids) > 0 {
|
||||||
|
for i := range hwids {
|
||||||
|
if strings.ToLower(hwids[i]) == hwidLC {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hwid, ok := property.(string); ok && strings.ToLower(hwid) == hwidLC {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue