diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-06-10 16:14:36 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-06-10 16:14:36 +0200 |
| commit | 1065db6ec3e2e0485bd39a5730942071f5cdbaf4 (patch) | |
| tree | e82417eefe218d259641a226cf70a32889d73fbe | |
| parent | 5687ad3931130b024578068df9f0a4fe60e3910f (diff) | |
| parent | 5688bbdd740f42023275daba6475c43cfe3fa5d4 (diff) | |
| download | mullvadvpn-1065db6ec3e2e0485bd39a5730942071f5cdbaf4.tar.xz mullvadvpn-1065db6ec3e2e0485bd39a5730942071f5cdbaf4.zip | |
Merge branch 'win-st-reset-post-hibernation'
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/driver.rs | 53 | ||||
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/mod.rs | 2 |
2 files changed, 31 insertions, 24 deletions
diff --git a/talpid-core/src/split_tunnel/windows/driver.rs b/talpid-core/src/split_tunnel/windows/driver.rs index 158101d515..70fe90f45d 100644 --- a/talpid-core/src/split_tunnel/windows/driver.rs +++ b/talpid-core/src/split_tunnel/windows/driver.rs @@ -63,6 +63,7 @@ pub enum DriverIoctlCode { ClearConfiguration = ctl_code(ST_DEVICE_TYPE, 8, METHOD_NEITHER, FILE_ANY_ACCESS), GetState = ctl_code(ST_DEVICE_TYPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS), QueryProcess = ctl_code(ST_DEVICE_TYPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS), + Reset = ctl_code(ST_DEVICE_TYPE, 11, METHOD_NEITHER, FILE_ANY_ACCESS), } #[derive(Debug, PartialEq)] @@ -206,6 +207,10 @@ pub enum DeviceHandleError { /// Failed to clear configuration in driver #[error(display = "Failed to clear configuration in driver")] ClearConfigError(#[error(source)] io::Error), + + /// Failed to reset driver state to "started" + #[error(display = "Failed to reset driver state")] + ResetError(#[error(source)] io::Error), } impl DeviceHandle { @@ -226,35 +231,26 @@ impl DeviceHandle { })?; let device = Self { handle }; + device.reinitialize()?; + Ok(device) + } - // Initialize the driver - let state = device - .get_driver_state() - .map_err(DeviceHandleError::GetStateError)?; - if state == DriverState::Started { - log::trace!("Initializing driver"); - device - .initialize() - .map_err(DeviceHandleError::InitializationError)?; - } - - // Initialize process tree - let state = device + pub fn reinitialize(&self) -> Result<(), DeviceHandleError> { + let state = self .get_driver_state() .map_err(DeviceHandleError::GetStateError)?; - if state == DriverState::Initialized { - log::trace!("Registering processes"); - device - .register_processes() - .map_err(DeviceHandleError::RegisterProcessesError)?; + if state != DriverState::Started { + log::debug!("Resetting driver state"); + self.reset().map_err(DeviceHandleError::ResetError)?; } - log::trace!("Clearing any existing exclusion config"); - device - .clear_config() - .map_err(DeviceHandleError::ClearConfigError)?; + log::debug!("Initializing driver"); + self.initialize() + .map_err(DeviceHandleError::InitializationError)?; - Ok(device) + log::debug!("Initializing driver process tree"); + self.register_processes() + .map_err(DeviceHandleError::RegisterProcessesError) } fn initialize(&self) -> io::Result<()> { @@ -406,6 +402,17 @@ impl DeviceHandle { Ok(()) } + + fn reset(&self) -> io::Result<()> { + device_io_control( + self.handle.as_raw_handle(), + DriverIoctlCode::Reset as u32, + None, + 0, + None, + )?; + Ok(()) + } } impl AsRawHandle for DeviceHandle { diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs index 6c3d8b9368..5b5b29e0cc 100644 --- a/talpid-core/src/split_tunnel/windows/mod.rs +++ b/talpid-core/src/split_tunnel/windows/mod.rs @@ -156,7 +156,7 @@ struct EventThreadContext { unsafe impl Send for EventThreadContext {} impl SplitTunnel { - /// Initialize the driver. + /// Initialize the split tunnel device. pub fn new( runtime: tokio::runtime::Handle, daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>, |
