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:
parent
26fb615b11
commit
7305b4ce93
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user