Skip to main content

export_apply

Macro export_apply 

Source
macro_rules! export_apply {
    ($apply:ident, $export_name:literal) => { ... };
}
Expand description

Usage:

ib_hook::inject::dll::app::export_apply!(apply_hook, "apply_hook");

§Implementation

For example:

#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub(crate) struct ArgAndResultBufInfo {
    pub data: u64,
    pub len: u64,
    pub is_error: bool,
}

const _: () = {
    #[unsafe(export_name = "ib_shell_apply")]
    pub unsafe extern "system" fn _ib_hook_inject_dll_app_apply(
        __args_and_params: *mut ::core::ffi::c_void,
    ) {
        let buf_info_ptr = __args_and_params;
        let buf_info_ptr = buf_info_ptr.cast::<ArgAndResultBufInfo>();
        let buf_info = unsafe { &mut *buf_info_ptr };
        // buf_info.len = buf_info.len - 1;
        let buf =
            unsafe { slice::from_raw_parts_mut(buf_info.data as *mut u8, buf_info.len as usize) };
        // dbg!(&buf_info);

        let config = bincode::config::standard();

        // eprintln!("decode_from_slice {:02X?}", buf);
        let args: Result<((Option<Input>,), usize), bincode::error::DecodeError> =
            bincode::serde::decode_from_slice::<(Option<Input>,), _>(buf, config);
        // eprintln!("{:X}\n{:02X?}\nargs: {:?}", buf_info.data, buf, &args);

        ib_hook::inject::dll::app::__payload_procedure_helper(__args_and_params, |__args| {
            let (input,) = __args;

            // panic!(
            //     "{:X}\n{:02X?}\n{:?}\n{:?}",
            //     buf_info.data, buf, &input, &args
            // );
            apply_hook(input)
        });
    }
};

TODO: https://github.com/rust-lang/rust/issues/52393 TODO: https://github.com/rust-lang/rust/issues/143547 or proc macro