#[macro_export]
macro_rules! dinvoke {
($module:expr, $function:expr, $ty:ty, $($arg:expr),*) => {{
let address = $crate::module::get_proc_address($module, $function, None);
if address.is_null() {
None
} else {
let func = unsafe { core::mem::transmute::<*mut core::ffi::c_void, $ty>(address) };
Some(unsafe { func($($arg),*) })
}
}};
}
#[macro_export]
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
macro_rules! syscall {
($function_name:expr, $($y:expr), +) => {{
let ntdll = $crate::module::get_ntdll_address();
let addr = $crate::module::get_proc_address(ntdll, $function_name, None);
if addr.is_null() {
None
} else {
match $crate::ssn($function_name, ntdll) {
None => None,
Some(ssn) => {
match $crate::get_syscall_address(addr) {
None => None,
Some(syscall_addr) => {
let cnt = 0u32 $(+ { let _ = &$y; 1u32 })+;
Some(unsafe { $crate::asm::do_syscall(ssn, syscall_addr, cnt, $($y),+) })
}
}
}
}
}
}};
}
#[macro_export]
macro_rules! println {
($($arg:tt)*) => {{
use core::fmt::Write;
let mut console = $crate::console::ConsoleWriter;
let _ = writeln!(console, $($arg)*);
}};
}