summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2019-06-04 13:57:36 +0200
committerSimon Rozman <simon@rozman.si>2019-06-04 14:45:23 +0200
commit85b85e62e52198045ed853b81617db1f8c83c65f (patch)
tree0048d3682c92b9339884d8a67d511489969f6f6d
parent014f736480dae2dc8b81a7206831058c2c451ccd (diff)
wintun: set DI_QUIETINSTALL flag for GUI-less device management
Signed-off-by: Simon Rozman <simon@rozman.si>
-rw-r--r--tun/wintun/wintun_windows.go29
1 files changed, 26 insertions, 3 deletions
diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go
index 7b99a50..9dc4030 100644
--- a/tun/wintun/wintun_windows.go
+++ b/tun/wintun/wintun_windows.go
@@ -206,6 +206,13 @@ func CreateInterface(description string, hwndParent uintptr) (*Wintun, bool, err
return nil, false, fmt.Errorf("SetupDiCreateDeviceInfo failed: %v", err)
}
+ if hwndParent == 0 {
+ err = setQuietInstall(devInfoList, deviceData)
+ if err != nil {
+ return nil, false, fmt.Errorf("Setting quiet installation failed: %v", err)
+ }
+ }
+
// Set a device information element as the selected member of a device information set.
err = devInfoList.SetSelectedDevice(deviceData)
if err != nil {
@@ -441,6 +448,13 @@ func (wintun *Wintun) DeleteInterface(hwndParent uintptr) (bool, bool, error) {
}
if wintun.cfgInstanceID == wintun2.cfgInstanceID {
+ if hwndParent == 0 {
+ err = setQuietInstall(devInfoList, deviceData)
+ if err != nil {
+ return false, false, fmt.Errorf("Setting quiet installation failed: %v", err)
+ }
+ }
+
// Remove the device.
removeDeviceParams := setupapi.RemoveDeviceParams{
ClassInstallHeader: *setupapi.MakeClassInstallHeader(setupapi.DIF_REMOVE),
@@ -480,11 +494,20 @@ func checkReboot(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInf
return false, err
}
- if (devInstallParams.Flags & (setupapi.DI_NEEDREBOOT | setupapi.DI_NEEDRESTART)) != 0 {
- return true, nil
+ return (devInstallParams.Flags & (setupapi.DI_NEEDREBOOT | setupapi.DI_NEEDRESTART)) != 0, nil
+}
+
+//
+// setQuietInstall sets device install parameters for a quiet installation
+//
+func setQuietInstall(deviceInfoSet setupapi.DevInfo, deviceInfoData *setupapi.DevInfoData) error {
+ devInstallParams, err := deviceInfoSet.DeviceInstallParams(deviceInfoData)
+ if err != nil {
+ return err
}
- return false, nil
+ devInstallParams.Flags |= setupapi.DI_QUIETINSTALL
+ return deviceInfoSet.SetDeviceInstallParams(deviceInfoData, devInstallParams)
}
//