diff options
author | Simon Rozman <simon@rozman.si> | 2019-06-04 13:57:36 +0200 |
---|---|---|
committer | Simon Rozman <simon@rozman.si> | 2019-06-04 14:45:23 +0200 |
commit | 85b85e62e52198045ed853b81617db1f8c83c65f (patch) | |
tree | 0048d3682c92b9339884d8a67d511489969f6f6d | |
parent | 014f736480dae2dc8b81a7206831058c2c451ccd (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.go | 29 |
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) } // |