summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-02-19 12:42:19 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-07-02 09:54:19 +0200
commita8c994f271f928e3d1d037c95c49f0f56bb3d3fd (patch)
tree4b42e11db32ac3e0dbf6d0df1bc98b642e847e93
parentc19a54fb02ed692d763d00b16efac752d19d56cc (diff)
downloadmullvadvpn-a8c994f271f928e3d1d037c95c49f0f56bb3d3fd.tar.xz
mullvadvpn-a8c994f271f928e3d1d037c95c49f0f56bb3d3fd.zip
Handle error message events from split tunneling driver
-rw-r--r--talpid-core/src/split_tunnel/windows/driver.rs46
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs4
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())
+ }
_ => (),
}
}