use std::io;
use std::mem;
use std::os::windows::io::AsRawHandle;
use std::os::windows::io::RawHandle;
use std::ptr;
use windows_sys::Win32::Foundation::HANDLE;
use windows_sys::Win32::Foundation::STATUS_SUCCESS;
use windows_sys::Win32::NetworkManagement::WindowsFilteringPlatform::FWPM_SESSION_FLAG_DYNAMIC;
use windows_sys::Win32::NetworkManagement::WindowsFilteringPlatform::FwpmEngineClose0;
use windows_sys::Win32::NetworkManagement::WindowsFilteringPlatform::{
FWPM_SESSION0, FwpmEngineOpen0,
};
use windows_sys::Win32::System::Rpc::RPC_C_AUTHN_DEFAULT;
pub struct FilterEngineBuilder {
session: FWPM_SESSION0,
}
unsafe impl Send for FilterEngineBuilder {}
impl Default for FilterEngineBuilder {
fn default() -> Self {
Self {
session: unsafe { mem::zeroed() },
}
}
}
impl FilterEngineBuilder {
pub fn open(self) -> io::Result<FilterEngine> {
let mut handle: HANDLE = ptr::null_mut();
let result = unsafe {
FwpmEngineOpen0(
ptr::null_mut(),
RPC_C_AUTHN_DEFAULT as u32,
ptr::null_mut(),
&self.session,
&mut handle,
)
};
if result != STATUS_SUCCESS as u32 {
return Err(io::Error::last_os_error());
}
Ok(FilterEngine { handle })
}
pub fn dynamic(mut self) -> Self {
self.session.flags |= FWPM_SESSION_FLAG_DYNAMIC;
self
}
}
pub struct FilterEngine {
handle: HANDLE,
}
unsafe impl Send for FilterEngine {}
impl AsRawHandle for FilterEngine {
fn as_raw_handle(&self) -> RawHandle {
self.handle
}
}
impl Drop for FilterEngine {
fn drop(&mut self) {
unsafe { FwpmEngineClose0(self.handle) };
}
}