-where
- Storage: AsRef<[u8]> + AsMut<[u8]>,
-{
- #[inline]
- pub fn get_bit(&self, index: usize) -> bool {
- debug_assert!(index / 8 < self.storage.as_ref().len());
- let byte_index = index / 8;
- let byte = self.storage.as_ref()[byte_index];
- let bit_index = if cfg!(target_endian = "big") {
- 7 - (index % 8)
- } else {
- index % 8
- };
- let mask = 1 << bit_index;
- byte & mask == mask
- }
- #[inline]
- pub fn set_bit(&mut self, index: usize, val: bool) {
- debug_assert!(index / 8 < self.storage.as_ref().len());
- let byte_index = index / 8;
- let byte = &mut self.storage.as_mut()[byte_index];
- let bit_index = if cfg!(target_endian = "big") {
- 7 - (index % 8)
- } else {
- index % 8
- };
- let mask = 1 << bit_index;
- if val {
- *byte |= mask;
- } else {
- *byte &= !mask;
- }
- }
- #[inline]
- pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 {
- debug_assert!(bit_width <= 64);
- debug_assert!(bit_offset / 8 < self.storage.as_ref().len());
- debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len());
- let mut val = 0;
- for i in 0..(bit_width as usize) {
- if self.get_bit(i + bit_offset) {
- let index = if cfg!(target_endian = "big") {
- bit_width as usize - 1 - i
- } else {
- i
- };
- val |= 1 << index;
- }
- }
- val
- }
- #[inline]
- pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) {
- debug_assert!(bit_width <= 64);
- debug_assert!(bit_offset / 8 < self.storage.as_ref().len());
- debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len());
- for i in 0..(bit_width as usize) {
- let mask = 1 << i;
- let val_bit_is_set = val & mask == mask;
- let index = if cfg!(target_endian = "big") {
- bit_width as usize - 1 - i
- } else {
- i
- };
- self.set_bit(index + bit_offset, val_bit_is_set);
- }
- }
-}
-pub type wchar_t = ::std::os::raw::c_ushort;
-pub type DWORD = ::std::os::raw::c_ulong;
-pub type BOOL = ::std::os::raw::c_int;
-pub type BYTE = ::std::os::raw::c_uchar;
-pub type ULONG64 = ::std::os::raw::c_ulonglong;
-pub type DWORD64 = ::std::os::raw::c_ulonglong;
-pub type WCHAR = wchar_t;
-pub type LPCWSTR = *const WCHAR;
-pub type HANDLE = *mut ::std::os::raw::c_void;
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct _GUID {
- pub Data1: ::std::os::raw::c_ulong,
- pub Data2: ::std::os::raw::c_ushort,
- pub Data3: ::std::os::raw::c_ushort,
- pub Data4: [::std::os::raw::c_uchar; 8usize],
-}
-#[test]
-fn bindgen_test_layout__GUID() {
- assert_eq!(
- ::std::mem::size_of::<_GUID>(),
- 16usize,
- concat!("Size of: ", stringify!(_GUID))
- );
- assert_eq!(
- ::std::mem::align_of::<_GUID>(),
- 4usize,
- concat!("Alignment of ", stringify!(_GUID))
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_GUID>())).Data1 as *const _ as usize },
- 0usize,
- concat!(
- "Offset of field: ",
- stringify!(_GUID),
- "::",
- stringify!(Data1)
- )
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_GUID>())).Data2 as *const _ as usize },
- 4usize,
- concat!(
- "Offset of field: ",
- stringify!(_GUID),
- "::",
- stringify!(Data2)
- )
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_GUID>())).Data3 as *const _ as usize },
- 6usize,
- concat!(
- "Offset of field: ",
- stringify!(_GUID),
- "::",
- stringify!(Data3)
- )
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_GUID>())).Data4 as *const _ as usize },
- 8usize,
- concat!(
- "Offset of field: ",
- stringify!(_GUID),
- "::",
- stringify!(Data4)
- )
- );
-}
-pub type GUID = _GUID;
-#[repr(C)]
-#[derive(Copy, Clone)]
-pub union _NET_LUID_LH {
- pub Value: ULONG64,
- pub Info: _NET_LUID_LH__bindgen_ty_1,
-}
-#[repr(C)]
-#[repr(align(8))]
-#[derive(Debug, Copy, Clone)]
-pub struct _NET_LUID_LH__bindgen_ty_1 {
- pub _bitfield_align_1: [u32; 0],
- pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>,
-}
-#[test]
-fn bindgen_test_layout__NET_LUID_LH__bindgen_ty_1() {
- assert_eq!(
- ::std::mem::size_of::<_NET_LUID_LH__bindgen_ty_1>(),
- 8usize,
- concat!("Size of: ", stringify!(_NET_LUID_LH__bindgen_ty_1))
- );
- assert_eq!(
- ::std::mem::align_of::<_NET_LUID_LH__bindgen_ty_1>(),
- 8usize,
- concat!("Alignment of ", stringify!(_NET_LUID_LH__bindgen_ty_1))
- );
-}
-impl _NET_LUID_LH__bindgen_ty_1 {
- #[inline]
- pub fn Reserved(&self) -> ULONG64 {
- unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 24u8) as u64) }
- }
- #[inline]
- pub fn set_Reserved(&mut self, val: ULONG64) {
- unsafe {
- let val: u64 = ::std::mem::transmute(val);
- self._bitfield_1.set(0usize, 24u8, val as u64)
- }
- }
- #[inline]
- pub fn NetLuidIndex(&self) -> ULONG64 {
- unsafe { ::std::mem::transmute(self._bitfield_1.get(24usize, 24u8) as u64) }
- }
- #[inline]
- pub fn set_NetLuidIndex(&mut self, val: ULONG64) {
- unsafe {
- let val: u64 = ::std::mem::transmute(val);
- self._bitfield_1.set(24usize, 24u8, val as u64)
- }
- }
- #[inline]
- pub fn IfType(&self) -> ULONG64 {
- unsafe { ::std::mem::transmute(self._bitfield_1.get(48usize, 16u8) as u64) }
- }
- #[inline]
- pub fn set_IfType(&mut self, val: ULONG64) {
- unsafe {
- let val: u64 = ::std::mem::transmute(val);
- self._bitfield_1.set(48usize, 16u8, val as u64)
- }
- }
- #[inline]
- pub fn new_bitfield_1(
- Reserved: ULONG64,
- NetLuidIndex: ULONG64,
- IfType: ULONG64,
- ) -> __BindgenBitfieldUnit<[u8; 8usize]> {
- let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default();
- __bindgen_bitfield_unit.set(0usize, 24u8, {
- let Reserved: u64 = unsafe { ::std::mem::transmute(Reserved) };
- Reserved as u64
- });
- __bindgen_bitfield_unit.set(24usize, 24u8, {
- let NetLuidIndex: u64 = unsafe { ::std::mem::transmute(NetLuidIndex) };
- NetLuidIndex as u64
- });
- __bindgen_bitfield_unit.set(48usize, 16u8, {
- let IfType: u64 = unsafe { ::std::mem::transmute(IfType) };
- IfType as u64
- });
- __bindgen_bitfield_unit
- }
-}
-#[test]
-fn bindgen_test_layout__NET_LUID_LH() {
- assert_eq!(
- ::std::mem::size_of::<_NET_LUID_LH>(),
- 8usize,
- concat!("Size of: ", stringify!(_NET_LUID_LH))
- );
- assert_eq!(
- ::std::mem::align_of::<_NET_LUID_LH>(),
- 8usize,
- concat!("Alignment of ", stringify!(_NET_LUID_LH))
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_NET_LUID_LH>())).Value as *const _ as usize },
- 0usize,
- concat!(
- "Offset of field: ",
- stringify!(_NET_LUID_LH),
- "::",
- stringify!(Value)
- )
- );
- assert_eq!(
- unsafe { &(*(::std::ptr::null::<_NET_LUID_LH>())).Info as *const _ as usize },
- 0usize,
- concat!(
- "Offset of field: ",
- stringify!(_NET_LUID_LH),
- "::",
- stringify!(Info)
- )
- );
-}
-pub type NET_LUID_LH = _NET_LUID_LH;
-pub type NET_LUID = NET_LUID_LH;
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct _WINTUN_ADAPTER {
- _unused: [u8; 0],
-}
-#[doc = " A handle representing Wintun adapter"]
-pub type WINTUN_ADAPTER_HANDLE = *mut _WINTUN_ADAPTER;
-#[doc = "< Informational"]
-pub const WINTUN_LOGGER_LEVEL_WINTUN_LOG_INFO: WINTUN_LOGGER_LEVEL = 0;
-#[doc = "< Warning"]
-pub const WINTUN_LOGGER_LEVEL_WINTUN_LOG_WARN: WINTUN_LOGGER_LEVEL = 1;
-#[doc = "< Error"]
-pub const WINTUN_LOGGER_LEVEL_WINTUN_LOG_ERR: WINTUN_LOGGER_LEVEL = 2;
-#[doc = " Determines the level of logging, passed to WINTUN_LOGGER_CALLBACK."]
-pub type WINTUN_LOGGER_LEVEL = ::std::os::raw::c_int;
-#[doc = " Called by internal logger to report diagnostic messages"]
-#[doc = ""]
-#[doc = " @param Level Message level."]
-#[doc = ""]
-#[doc = " @param Timestamp Message timestamp in in 100ns intervals since 1601-01-01 UTC."]
-#[doc = ""]
-#[doc = " @param Message Message text."]
-pub type WINTUN_LOGGER_CALLBACK = ::std::option::Option<
- unsafe extern "C" fn(Level: WINTUN_LOGGER_LEVEL, Timestamp: DWORD64, Message: LPCWSTR),
->;
-#[repr(C)]
-#[derive(Debug, Copy, Clone)]
-pub struct _TUN_SESSION {
- _unused: [u8; 0],
-}
-#[doc = " A handle representing Wintun session"]
-pub type WINTUN_SESSION_HANDLE = *mut _TUN_SESSION;
-extern crate libloading;
-pub struct wintun {
- __library: ::libloading::Library,
- pub WintunCreateAdapter: unsafe extern "C" fn(
- arg1: LPCWSTR,
- arg2: LPCWSTR,
- arg3: *const GUID,
- ) -> WINTUN_ADAPTER_HANDLE,
- pub WintunCloseAdapter: unsafe extern "C" fn(arg1: WINTUN_ADAPTER_HANDLE),
- pub WintunOpenAdapter: unsafe extern "C" fn(arg1: LPCWSTR) -> WINTUN_ADAPTER_HANDLE,
- pub WintunGetAdapterLUID:
- unsafe extern "C" fn(arg1: WINTUN_ADAPTER_HANDLE, arg2: *mut NET_LUID),
- pub WintunGetRunningDriverVersion: unsafe extern "C" fn() -> DWORD,
- pub WintunDeleteDriver: unsafe extern "C" fn() -> BOOL,
- pub WintunSetLogger: unsafe extern "C" fn(arg1: WINTUN_LOGGER_CALLBACK),
- pub WintunStartSession:
- unsafe extern "C" fn(arg1: WINTUN_ADAPTER_HANDLE, arg2: DWORD) -> WINTUN_SESSION_HANDLE,
- pub WintunEndSession: unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE),
- pub WintunGetReadWaitEvent: unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE) -> HANDLE,
- pub WintunReceivePacket:
- unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE, arg2: *mut DWORD) -> *mut BYTE,
- pub WintunReleaseReceivePacket:
- unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE, arg2: *const BYTE),
- pub WintunAllocateSendPacket:
- unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE, arg2: DWORD) -> *mut BYTE,
- pub WintunSendPacket: unsafe extern "C" fn(arg1: WINTUN_SESSION_HANDLE, arg2: *const BYTE),
-}
-impl wintun {
- pub unsafe fn new(path: P) -> Result
- where
- P: AsRef<::std::ffi::OsStr>,
- {
- let library = ::libloading::Library::new(path)?;
- Self::from_library(library)
- }
- pub unsafe fn from_library(library: L) -> Result
- where
- L: Into<::libloading::Library>,
- {
- let __library = library.into();
- let WintunCreateAdapter = __library.get(b"WintunCreateAdapter\0").map(|sym| *sym)?;
- let WintunCloseAdapter = __library.get(b"WintunCloseAdapter\0").map(|sym| *sym)?;
- let WintunOpenAdapter = __library.get(b"WintunOpenAdapter\0").map(|sym| *sym)?;
- let WintunGetAdapterLUID = __library.get(b"WintunGetAdapterLUID\0").map(|sym| *sym)?;
- let WintunGetRunningDriverVersion = __library
- .get(b"WintunGetRunningDriverVersion\0")
- .map(|sym| *sym)?;
- let WintunDeleteDriver = __library.get(b"WintunDeleteDriver\0").map(|sym| *sym)?;
- let WintunSetLogger = __library.get(b"WintunSetLogger\0").map(|sym| *sym)?;
- let WintunStartSession = __library.get(b"WintunStartSession\0").map(|sym| *sym)?;
- let WintunEndSession = __library.get(b"WintunEndSession\0").map(|sym| *sym)?;
- let WintunGetReadWaitEvent = __library.get(b"WintunGetReadWaitEvent\0").map(|sym| *sym)?;
- let WintunReceivePacket = __library.get(b"WintunReceivePacket\0").map(|sym| *sym)?;
- let WintunReleaseReceivePacket = __library
- .get(b"WintunReleaseReceivePacket\0")
- .map(|sym| *sym)?;
- let WintunAllocateSendPacket = __library
- .get(b"WintunAllocateSendPacket\0")
- .map(|sym| *sym)?;
- let WintunSendPacket = __library.get(b"WintunSendPacket\0").map(|sym| *sym)?;
- Ok(wintun {
- __library,
- WintunCreateAdapter,
- WintunCloseAdapter,
- WintunOpenAdapter,
- WintunGetAdapterLUID,
- WintunGetRunningDriverVersion,
- WintunDeleteDriver,
- WintunSetLogger,
- WintunStartSession,
- WintunEndSession,
- WintunGetReadWaitEvent,
- WintunReceivePacket,
- WintunReleaseReceivePacket,
- WintunAllocateSendPacket,
- WintunSendPacket,
- })
- }
- pub unsafe fn WintunCreateAdapter(
- &self,
- arg1: LPCWSTR,
- arg2: LPCWSTR,
- arg3: *const GUID,
- ) -> WINTUN_ADAPTER_HANDLE {
- (self.WintunCreateAdapter)(arg1, arg2, arg3)
- }
- pub unsafe fn WintunCloseAdapter(&self, arg1: WINTUN_ADAPTER_HANDLE) -> () {
- (self.WintunCloseAdapter)(arg1)
- }
- pub unsafe fn WintunOpenAdapter(&self, arg1: LPCWSTR) -> WINTUN_ADAPTER_HANDLE {
- (self.WintunOpenAdapter)(arg1)
- }
- pub unsafe fn WintunGetAdapterLUID(
- &self,
- arg1: WINTUN_ADAPTER_HANDLE,
- arg2: *mut NET_LUID,
- ) -> () {
- (self.WintunGetAdapterLUID)(arg1, arg2)
- }
- pub unsafe fn WintunGetRunningDriverVersion(&self) -> DWORD {
- (self.WintunGetRunningDriverVersion)()
- }
- pub unsafe fn WintunDeleteDriver(&self) -> BOOL {
- (self.WintunDeleteDriver)()
- }
- pub unsafe fn WintunSetLogger(&self, arg1: WINTUN_LOGGER_CALLBACK) -> () {
- (self.WintunSetLogger)(arg1)
- }
- pub unsafe fn WintunStartSession(
- &self,
- arg1: WINTUN_ADAPTER_HANDLE,
- arg2: DWORD,
- ) -> WINTUN_SESSION_HANDLE {
- (self.WintunStartSession)(arg1, arg2)
- }
- pub unsafe fn WintunEndSession(&self, arg1: WINTUN_SESSION_HANDLE) -> () {
- (self.WintunEndSession)(arg1)
- }
- pub unsafe fn WintunGetReadWaitEvent(&self, arg1: WINTUN_SESSION_HANDLE) -> HANDLE {
- (self.WintunGetReadWaitEvent)(arg1)
- }
- pub unsafe fn WintunReceivePacket(
- &self,
- arg1: WINTUN_SESSION_HANDLE,
- arg2: *mut DWORD,
- ) -> *mut BYTE {
- (self.WintunReceivePacket)(arg1, arg2)
- }
- pub unsafe fn WintunReleaseReceivePacket(
- &self,
- arg1: WINTUN_SESSION_HANDLE,
- arg2: *const BYTE,
- ) -> () {
- (self.WintunReleaseReceivePacket)(arg1, arg2)
- }
- pub unsafe fn WintunAllocateSendPacket(
- &self,
- arg1: WINTUN_SESSION_HANDLE,
- arg2: DWORD,
- ) -> *mut BYTE {
- (self.WintunAllocateSendPacket)(arg1, arg2)
- }
- pub unsafe fn WintunSendPacket(&self, arg1: WINTUN_SESSION_HANDLE, arg2: *const BYTE) -> () {
- (self.WintunSendPacket)(arg1, arg2)
- }
-}