diff options
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/driver.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/talpid-core/src/split_tunnel/windows/driver.rs b/talpid-core/src/split_tunnel/windows/driver.rs index a539c84e3c..92eee527da 100644 --- a/talpid-core/src/split_tunnel/windows/driver.rs +++ b/talpid-core/src/split_tunnel/windows/driver.rs @@ -16,6 +16,7 @@ use std::{ io::{AsRawHandle, RawHandle}, }, ptr, + time::Duration, }; use winapi::{ shared::{ @@ -26,7 +27,7 @@ use winapi::{ }, um::{ handleapi::CloseHandle, - ioapiset::{DeviceIoControl, GetOverlappedResult}, + ioapiset::{DeviceIoControl, GetOverlappedResultEx}, minwinbase::OVERLAPPED, synchapi::CreateEventW, tlhelp32::TH32CS_SNAPPROCESS, @@ -38,6 +39,8 @@ use winapi::{ const DRIVER_SYMBOLIC_NAME: &str = "\\\\.\\MULLVADSPLITTUNNEL"; const ST_DEVICE_TYPE: u32 = 0x8000; +const DRIVER_IO_TIMEOUT: Duration = Duration::from_secs(3); + const fn ctl_code(device_type: u32, function: u32, method: u32, access: u32) -> u32 { device_type << 16 | access << 14 | function << 2 | method } @@ -702,8 +705,15 @@ pub fn device_io_control_buffer( return Err(last_error); } - let result = - unsafe { GetOverlappedResult(device as *mut _, overlapped, &mut returned_bytes, TRUE) }; + let result = unsafe { + GetOverlappedResultEx( + device as *mut _, + overlapped, + &mut returned_bytes, + DRIVER_IO_TIMEOUT.as_millis() as u32, + FALSE, + ) + }; if result == 0 { return Err(io::Error::last_os_error()); |
