diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-02-19 12:42:19 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-07-02 09:54:19 +0200 |
| commit | a8c994f271f928e3d1d037c95c49f0f56bb3d3fd (patch) | |
| tree | 4b42e11db32ac3e0dbf6d0df1bc98b642e847e93 | |
| parent | c19a54fb02ed692d763d00b16efac752d19d56cc (diff) | |
| download | mullvadvpn-a8c994f271f928e3d1d037c95c49f0f56bb3d3fd.tar.xz mullvadvpn-a8c994f271f928e3d1d037c95c49f0f56bb3d3fd.zip | |
Handle error message events from split tunneling driver
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/driver.rs | 46 | ||||
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/mod.rs | 4 |
2 files changed, 50 insertions, 0 deletions
diff --git a/talpid-core/src/split_tunnel/windows/driver.rs b/talpid-core/src/split_tunnel/windows/driver.rs index 3a9f4e1eb2..f0d87164a0 100644 --- a/talpid-core/src/split_tunnel/windows/driver.rs +++ b/talpid-core/src/split_tunnel/windows/driver.rs @@ -23,6 +23,7 @@ use winapi::{ in6addr::IN6_ADDR, inaddr::IN_ADDR, minwindef::{FALSE, TRUE}, + ntdef::NTSTATUS, winerror::{ERROR_INVALID_PARAMETER, ERROR_IO_PENDING}, }, um::{ @@ -91,6 +92,8 @@ pub enum EventId { ErrorStartSplittingProcess = 0x80000001, ErrorStopSplittingProcess, + ErrorMessage, + Unknown, } @@ -104,6 +107,10 @@ pub enum EventBody { process_id: u32, image: OsString, }, + ErrorMessage { + status: NTSTATUS, + message: OsString, + }, } #[repr(u32)] @@ -544,6 +551,12 @@ struct SplittingErrorEventHeader { image_name_length: u16, } +#[repr(C)] +struct ErrorMessageEventHeader { + status: NTSTATUS, + error_message_length: u16, +} + pub fn parse_event_buffer(buffer: &Vec<u8>) -> Option<(EventId, EventBody)> { let mut raw_event_id = 0u32; unsafe { @@ -634,6 +647,39 @@ pub fn parse_event_buffer(buffer: &Vec<u8>) -> Option<(EventId, EventBody)> { }, )) } + EventId::ErrorMessage => { + let mut event: ErrorMessageEventHeader = unsafe { mem::zeroed() }; + unsafe { + ptr::copy_nonoverlapping( + &buffer[mem::size_of_val(&event_header)], + &mut event as *mut _ as *mut u8, + mem::size_of_val(&event), + ) + }; + + let mut error_message = Vec::new(); + error_message.resize( + event.error_message_length as usize / mem::size_of::<u16>(), + 0u16, + ); + + unsafe { + ptr::copy_nonoverlapping( + &buffer[mem::size_of_val(&event_header) + mem::size_of_val(&event)] as *const _ + as *const u16, + error_message.as_mut_ptr(), + error_message.len(), + ) + }; + + Some(( + event_header.event_id, + EventBody::ErrorMessage { + status: event.status, + message: OsStringExt::from_wide(&error_message), + }, + )) + } EventId::Unknown => None, } } diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs index 3d5efee414..031b68a6e9 100644 --- a/talpid-core/src/split_tunnel/windows/mod.rs +++ b/talpid-core/src/split_tunnel/windows/mod.rs @@ -177,6 +177,7 @@ impl SplitTunnel { EventId::StopSplittingProcess | EventId::ErrorStopSplittingProcess => { "Stop splitting process" } + EventId::ErrorMessage => "ErrorMessage", _ => "Unknown event ID", }; @@ -189,6 +190,9 @@ impl SplitTunnel { image, ); } + EventBody::ErrorMessage { status, message } => { + log::error!("NTSTATUS {:#x}: {}", status, message.to_string_lossy()) + } _ => (), } } |
