#[macro_export]
macro_rules! make_fn {
($address:expr, $returntype:ty) => {
std::mem::transmute::<*const usize, fn() -> $returntype>($address as *const usize)
};
($address:expr, $returntype:ty, $($argument:ty),*) => {
std::mem::transmute::<*const usize, fn($($argument,)*) -> $returntype>($address as *const usize)
}
}
#[macro_export]
macro_rules! create_function_definitions {
($(($calling_convention:tt $visible:vis $function_name:ident[$index:literal] -> $return_type:ty;$(($param_name:ident,$param_type:ty));*)),*) =>{
$(
$visible fn $function_name(&self, $($param_name: $param_type),*) -> $return_type{
unsafe {
use ::winapi::shared::minwindef::LPVOID;
use ::std::mem::transmute;
use crate::util::get_vfunc_address;
if $calling_convention == "thiscall" {
return transmute::<LPVOID, extern $calling_convention fn(LPVOID, $($param_type),*) -> $return_type>(get_vfunc_address(self.this_ptr.get(), $index))(self.this_ptr.get(), $($param_name),*);
}
transmute::<LPVOID, extern $calling_convention fn($($param_type),*) -> $return_type>(get_vfunc_address(self.this_ptr.get(), $index))($($param_name),*)
}
}
)*
};
}
#[macro_export]
macro_rules! make_functions {
( $( $address:expr; fn $fn_name:ident( $($argument:ty),* ) -> $returntype:ty);* ;) => {
$(
$fn_name = std::mem::transmute::<*const usize, fn( $($argument),* ) -> $returntype>($address as *const usize);
);*
}
}
#[macro_export]
macro_rules! ptr {
($address:expr, $type:ty) => {
*($address as *mut $type)
};
}