#![doc = include_str!("../README.md")]
#![recursion_limit = "1024"]
mod adapter;
#[cfg(feature = "async")]
mod async_session;
mod dns_via_reg;
mod error;
mod ffi;
mod fn_holder;
mod handle;
mod log;
mod packet;
mod session;
mod util;
#[cfg(feature = "verify_binary_signature")]
mod verify_binary_signature;
#[cfg(feature = "verify_binary_signature")]
pub(crate) const WINTUN_PROVIDER: &str = "WireGuard LLC";
#[allow(dead_code, unused_variables, deref_nullptr, clippy::all)]
mod wintun_raw;
#[cfg(feature = "async")]
pub use crate::async_session::AsyncSession;
pub use crate::{
adapter::Adapter,
error::{BoxError, Error, OutOfRangeData, Result},
handle::UnsafeHandle,
log::{default_logger, reset_logger, set_logger},
packet::Packet,
session::Session,
util::get_active_network_interface_gateways,
};
#[doc(hidden)]
pub use util::{format_message, get_wintun_bin_pattern_path, run_command, set_adapter_mtu};
pub use windows_sys::Win32::{Foundation::HANDLE, NetworkManagement::Ndis::NET_LUID_LH};
pub const MAX_RING_CAPACITY: u32 = wintun_raw::WINTUN_MAX_RING_CAPACITY;
pub const MIN_RING_CAPACITY: u32 = wintun_raw::WINTUN_MIN_RING_CAPACITY;
pub const MAX_IP_PACKET_SIZE: u32 = wintun_raw::WINTUN_MAX_IP_PACKET_SIZE;
pub const MAX_POOL: usize = 256;
pub type Wintun = Arc<wintun_raw::wintun>;
use std::sync::Arc;
pub unsafe fn load() -> Result<Wintun, Error> {
unsafe { load_from_path("wintun") }
}
pub unsafe fn load_from_path<P>(path: P) -> Result<Wintun, Error>
where
P: AsRef<::std::ffi::OsStr>,
{
#[cfg(feature = "verify_binary_signature")]
{
use verify_binary_signature::{get_dll_absolute_path, get_signer_name, verify_signature};
let abs_path = unsafe { get_dll_absolute_path(&path) }?;
verify_signature(&abs_path)?;
let signer_name = get_signer_name(&abs_path)?;
let wp = WINTUN_PROVIDER;
if signer_name != wp {
return Err(format!("Signer \"{}\" not match \"{}\"", signer_name, wp).into());
}
}
let path2: std::path::PathBuf = path.as_ref().into();
unsafe { Ok(Arc::new(wintun_raw::wintun::new(&path2)?)) }
}
pub unsafe fn load_from_library<L>(library: L) -> Result<Wintun, Error>
where
L: Into<libloading::Library>,
{
unsafe { Ok(Arc::new(wintun_raw::wintun::from_library(library)?)) }
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub struct Version {
pub major: u16,
pub minor: u16,
}
impl std::fmt::Display for Version {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}", self.major, self.minor)
}
}
pub fn get_running_driver_version(wintun: &Wintun) -> Result<Version> {
let version = unsafe { wintun.WintunGetRunningDriverVersion() };
if version == 0 {
Err(util::get_last_error()?.into())
} else {
let v = version.to_be_bytes();
Ok(Version {
major: u16::from_be_bytes([v[0], v[1]]),
minor: u16::from_be_bytes([v[2], v[3]]),
})
}
}