wintun: upgrade deleting all interfaces and make it reusable

DeleteAllInterfaces() didn't check if SPDRP_DEVICEDESC == "WireGuard
Tunnel". It deleted _all_ Wintun adapters, not just WireGuard's.

Furthermore, the DeleteAllInterfaces() was upgraded into a new function
called DeleteMatchingInterfaces() for selectively deletion. This will
be used by WireGuard to clean stale Wintun adapters.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2019-08-28 11:39:01 +02:00
parent 26fb615b11
commit 7305b4ce93

View File

@ -426,10 +426,10 @@ func (wintun *Wintun) DeleteInterface() (rebootRequired bool, err error) {
return checkReboot(devInfoList, deviceData), nil return checkReboot(devInfoList, deviceData), nil
} }
// DeleteAllInterfaces deletes all Wintun interfaces, and returns which // DeleteMatchingInterfaces deletes all Wintun interfaces, which match
// ones it deleted, whether a reboot is required after, and which errors // given criteria, and returns which ones it deleted, whether a reboot
// occurred during the process. // is required after, and which errors occurred during the process.
func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) { func DeleteMatchingInterfaces(matches func(wintun *Wintun) bool) (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) {
devInfoList, err := setupapi.SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, setupapi.DIGCF_PRESENT, setupapi.DevInfo(0), "") devInfoList, err := setupapi.SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, setupapi.DIGCF_PRESENT, setupapi.DevInfo(0), "")
if err != nil { if err != nil {
return nil, false, []error{fmt.Errorf("SetupDiGetClassDevsEx(%v) failed: %v", deviceClassNetGUID, err.Error())} return nil, false, []error{fmt.Errorf("SetupDiGetClassDevsEx(%v) failed: %v", deviceClassNetGUID, err.Error())}
@ -472,6 +472,22 @@ func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool
if !isWintun { if !isWintun {
continue continue
} }
deviceDescVal, err := devInfoList.DeviceRegistryProperty(deviceData, setupapi.SPDRP_DEVICEDESC)
if err != nil {
errors = append(errors, fmt.Errorf("DeviceRegistryPropertyString(SPDRP_DEVICEDESC) failed: %v", err))
continue
}
if deviceDesc, ok := deviceDescVal.(string); !ok || deviceDesc != deviceTypeName {
continue
}
wintun, err := makeWintun(devInfoList, deviceData)
if err != nil {
errors = append(errors, fmt.Errorf("makeWintun failed: %v", err))
continue
}
if !matches(wintun) {
continue
}
err = setQuietInstall(devInfoList, deviceData) err = setQuietInstall(devInfoList, deviceData)
if err != nil { if err != nil {
@ -500,6 +516,15 @@ func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool
return return
} }
// DeleteAllInterfaces deletes all Wintun interfaces, and returns which
// ones it deleted, whether a reboot is required after, and which errors
// occurred during the process.
func DeleteAllInterfaces() (deviceInstancesDeleted []uint32, rebootRequired bool, errors []error) {
return DeleteMatchingInterfaces(func(wintun *Wintun) bool {
return true
})
}
// checkReboot checks device install parameters if a system reboot is required. // checkReboot checks device install parameters if a system reboot is required.
func checkReboot(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInfoData) bool { func checkReboot(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInfoData) bool {
devInstallParams, err := deviceInfoSet.DeviceInstallParams(deviceInfoData) devInstallParams, err := deviceInfoSet.DeviceInstallParams(deviceInfoData)