mod global;
mod interface;
mod makestruct;
pub use global::*;
mod function;
pub use function::*;
mod bitstruct;
pub use bitstruct::*;
pub enum ResolveBy<const N: usize> {
NameOffset {
module_name: &'static str,
offset: usize,
},
IdaPattern {
module_name: &'static str,
pattern: crate::Pattern<N>,
},
}
#[macro_export]
#[doc(hidden)]
macro_rules! __resolve_by {
(# $module:literal, $second:literal) => {
$crate::ResolveBy::<0>::NameOffset {
module_name: $module,
offset: $second,
}
};
(% $module:literal, $second:literal) => {
$crate::ResolveBy::IdaPattern {
module_name: $module,
pattern: $crate::ida_pat!($second),
}
};
}
#[doc(hidden)]
#[cfg(all(windows, feature = "std"))]
pub fn __default_resolver<const N: usize>(res: ResolveBy<N>) -> usize {
use crate::internal::{find_module_by_name, find_pattern_in_module};
match res {
ResolveBy::NameOffset {
module_name,
offset,
} => {
find_module_by_name(module_name)
.expect("Module not found")
.base as usize
+ offset
}
ResolveBy::IdaPattern {
module_name,
pattern,
} => find_pattern_in_module(pattern, module_name)
.unwrap()
.next()
.unwrap() as usize,
}
}
#[doc(hidden)]
#[cfg(not(windows))]
pub fn __default_resolver<const N: usize>(_: ResolveBy<N>) -> usize {
unimplemented!()
}
#[doc(hidden)]
#[macro_export]
macro_rules! __resolver {
() => {
$crate::__default_resolver
};
($item:path) => {
$item
};
}
#[macro_export]
macro_rules! size_of {
($ty:ty) => {
core::mem::size_of::<$ty>()
};
(@ $var:ident) => {
core::mem::size_of_val(&$var)
};
}
#[macro_export]
macro_rules! offset_of {
($target:ty, $($field:tt).* $(,)?) => {{
let base = core::mem::MaybeUninit::<$target>::uninit();
let base_ptr = base.as_ptr();
#[allow(unused_unsafe)]
unsafe {
let field_ptr = core::ptr::addr_of!( (*base_ptr) $(.$field)* ).cast::<u8>();
field_ptr.offset_from(base_ptr.cast::<u8>()) as usize
}
}};
}
#[macro_export]
macro_rules! assert_size {
($target:ty, $size:expr) => {
const _: () = if core::mem::size_of::<$target>() != $size {
panic!(concat!(
"Size assertion failed! sizeof(",
stringify!($target),
") != ",
stringify!($size)
))
};
};
}
#[macro_export]
macro_rules! assert_offset {
($target:ty, $( $($field:ident).*, $offset:expr),* $(,)?) => {
$(
const _: () = if $crate::offset_of!($target, $($field).*) != $offset {
panic!(concat!(
"Offset assertion failed! offset_of!(",
stringify!($target),
", ",
stringify!( $($field).* ),
") != ",
stringify!($offset)
))
};
)*
}
}