Skip to main content

inline_hooks_config/
inline_hooks_config.rs

1//! EN: Manual config via `InlineHooksConfig` + `install_inline_hooks`.
2//! CN: 通过 `InlineHooksConfig` 手工配置并调用 `install_inline_hooks`。
3
4mod common;
5use dobby_rs_framework::prelude::*;
6
7// EN: Detours are shared via `common::detours`.
8// CN: detour 通过 `common::detours` 共享。
9
10fn main() -> dobby_rs_framework::Result<()> {
11    common::init_example_logging();
12
13    // EN: Build HookDef(s) using helpers.
14    // CN: 使用 helper 构造 HookDef。
15    #[cfg(unix)]
16    let hooks: Vec<HookDef> = vec![make_hook(
17        "puts",
18        "puts_cfg",
19        common::detours::unix::detour_puts
20            as unsafe extern "C" fn(*const core::ffi::c_char) -> core::ffi::c_int,
21    )];
22    #[cfg(windows)]
23    let hooks: Vec<HookDef> = vec![make_hook_simple(
24        "GetCurrentProcessId",
25        common::detours::windows::detour_get_current_process_id
26            as unsafe extern "system" fn() -> u32,
27    )];
28
29    let mut session: HookSession = unsafe {
30        install_inline_hooks(InlineHooksConfig {
31            lib_name: common::DEMO_LIB,
32            hooks,
33            extra_action: Some(Box::new(|m: &ModuleHandle| {
34                // EN: `ModuleHandle` is available here.
35                // CN: 这里可以拿到 `ModuleHandle`。
36                let sym = if cfg!(windows) {
37                    "GetCurrentProcessId"
38                } else {
39                    "puts"
40                };
41                common::resolve_and_print(m, sym)
42            })),
43        })?
44    };
45
46    unsafe { session.unhook_all()? };
47    Ok(())
48}