diff --git a/windows_kext/driver/Cargo.lock b/windows_kext/driver/Cargo.lock index 4a0e0b39..799de242 100644 --- a/windows_kext/driver/Cargo.lock +++ b/windows_kext/driver/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "atomic-polyfill" @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bitflags" @@ -31,15 +31,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "critical-section" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "driver" @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-complex", "num-integer", @@ -116,18 +116,18 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", @@ -136,19 +136,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -157,38 +156,37 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", @@ -197,9 +195,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -215,18 +213,18 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] @@ -239,9 +237,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.21" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "smoltcp" @@ -273,9 +271,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "syn" -version = "2.0.48" +version = "2.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" dependencies = [ "proc-macro2", "quote", @@ -284,9 +282,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "wdk" @@ -299,9 +297,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "windows-sys" diff --git a/windows_kext/driver/src/device.rs b/windows_kext/driver/src/device.rs index 801b7a98..bc1fafec 100644 --- a/windows_kext/driver/src/device.rs +++ b/windows_kext/driver/src/device.rs @@ -296,9 +296,21 @@ impl Device { } } - pub fn shutdown(&self) { + pub fn shutdown(&mut self) { // End blocking operations from the queue. This will end pending read requests. self.event_queue.rundown(); + + // Resolve all pending packets. This is important for proper driver unload. + let pending_packets = self.packet_cache.pop_all(); + for el in pending_packets { + let key = el.value.0; + let packet = el.value.1; + // Set any verdict. Driver will unload after that and the filter will not be active. + _ = self + .connection_cache + .update_connection(key, crate::connection::Verdict::PermanentBlock); + _ = self.inject_packet(packet, true); // Blocked must be set, so it only handles the ALE layer. + } } pub fn inject_packet(&mut self, packet: Packet, blocked: bool) -> Result<(), String> { diff --git a/windows_kext/driver/src/id_cache.rs b/windows_kext/driver/src/id_cache.rs index 9a0c4b27..e8d4f509 100644 --- a/windows_kext/driver/src/id_cache.rs +++ b/windows_kext/driver/src/id_cache.rs @@ -1,3 +1,5 @@ +use core::mem; + use alloc::collections::VecDeque; use protocol::info::Info; use smoltcp::wire::{IpAddress, IpProtocol}; @@ -5,8 +7,8 @@ use wdk::rw_spin_lock::RwSpinLock; use crate::{connection::Direction, connection_map::Key, device::Packet}; -struct Entry { - value: T, +pub struct Entry { + pub value: T, id: u64, } @@ -54,6 +56,14 @@ impl IdCache { let _guard = self.lock.read_lock(); return self.values.len(); } + + pub fn pop_all(&mut self) -> VecDeque> { + let mut values = VecDeque::with_capacity(1); + let _guard = self.lock.write_lock(); + mem::swap(&mut self.values, &mut values); + + return values; + } } fn get_payload(packet: &Packet) -> Option<&[u8]> { diff --git a/windows_kext/driver/src/logger.rs b/windows_kext/driver/src/logger.rs index 129f9f7c..8eb0ce02 100644 --- a/windows_kext/driver/src/logger.rs +++ b/windows_kext/driver/src/logger.rs @@ -10,15 +10,16 @@ pub const LOG_LEVEL: u8 = Severity::Warning as u8; // pub const LOG_LEVEL: u8 = Severity::Trace as u8; pub const MAX_LOG_LINE_SIZE: usize = 150; - -static mut LOG_LINES: [AtomicPtr; 1024] = unsafe { MaybeUninit::zeroed().assume_init() }; +const SIZE_OF_LOG_LINE_BUFFER: usize = 1024; +static mut LOG_LINES: [AtomicPtr; SIZE_OF_LOG_LINE_BUFFER] = + unsafe { MaybeUninit::zeroed().assume_init() }; static START_INDEX: AtomicUsize = unsafe { MaybeUninit::zeroed().assume_init() }; static END_INDEX: AtomicUsize = unsafe { MaybeUninit::zeroed().assume_init() }; pub fn add_line(log_line: Info) { let mut index = END_INDEX.fetch_add(1, Ordering::Acquire); unsafe { - index %= LOG_LINES.len(); + index %= SIZE_OF_LOG_LINE_BUFFER; let ptr = &mut LOG_LINES[index]; let line = Box::new(log_line); let old = ptr.swap(Box::into_raw(line), Ordering::SeqCst); @@ -38,7 +39,7 @@ pub fn flush() -> Vec { unsafe { let count = end_index - start_index; for i in start_index..start_index + count { - let index = i % LOG_LINES.len(); + let index = i % SIZE_OF_LOG_LINE_BUFFER; let ptr = LOG_LINES[index].swap(core::ptr::null_mut(), Ordering::SeqCst); if !ptr.is_null() { vec.push(*Box::from_raw(ptr)); diff --git a/windows_kext/kextinterface/version.txt b/windows_kext/kextinterface/version.txt index 186fe0af..58952f65 100644 --- a/windows_kext/kextinterface/version.txt +++ b/windows_kext/kextinterface/version.txt @@ -1 +1 @@ -[2, 0, 6, 0] +[2, 0, 7, 0] diff --git a/windows_kext/wdk/src/filter_engine/callout_data.rs b/windows_kext/wdk/src/filter_engine/callout_data.rs index ff155dd1..6efaac1f 100644 --- a/windows_kext/wdk/src/filter_engine/callout_data.rs +++ b/windows_kext/wdk/src/filter_engine/callout_data.rs @@ -86,7 +86,7 @@ impl<'a> CalloutData<'a> { }; } - pub fn get_value_byte_array16(&'a self, index: usize) -> &[u8; 16] { + pub fn get_value_byte_array16(&'a self, index: usize) -> &'a [u8; 16] { unsafe { return self.values[index].value.byte_array16.as_ref().unwrap(); }; diff --git a/windows_kext/wdk/src/filter_engine/net_buffer.rs b/windows_kext/wdk/src/filter_engine/net_buffer.rs index ff94ca80..08f828d8 100644 --- a/windows_kext/wdk/src/filter_engine/net_buffer.rs +++ b/windows_kext/wdk/src/filter_engine/net_buffer.rs @@ -87,15 +87,20 @@ impl NetBufferList { // Allocate space in buffer, if buffer is too small. let mut buffer = alloc::vec![0_u8; data_length as usize]; - let ptr = NdisGetDataBuffer(nb, data_length, buffer.as_mut_ptr(), 1, 0); + let buffer_ptr = buffer.as_mut_ptr(); - if !ptr.is_null() { + // Two options returns a pointer to the raw packet buffer, + // or copies the data to the supplied buffer + // and returns a pointer to the supplied buffer. + let ptr = NdisGetDataBuffer(nb, data_length, buffer_ptr, 1, 0); + + if ptr.is_null() { + return Err("failed to copy packet buffer".to_string()); + } + + // If the pointers differ the data is not in the correct place. + if ptr != buffer_ptr { buffer.copy_from_slice(core::slice::from_raw_parts(ptr, data_length as usize)); - } else { - let ptr = NdisGetDataBuffer(nb, data_length, buffer.as_mut_ptr(), 1, 0); - if ptr.is_null() { - return Err("failed to copy packet buffer".to_string()); - } } let new_nbl = net_allocator.wrap_packet_in_nbl(&buffer)?;