#pair #expressions #getter #generate #function #refer #calls

getfn

一个用于生成函数对以便通过自定义表达式引用函数的实用程序库

6 个版本

0.2.0 2023 年 11 月 3 日
0.1.4 2023 年 11 月 3 日
0.1.1 2021 年 6 月 1 日
0.1.0 2021 年 2 月 22 日

#1777Rust 模式

MIT/Apache

15KB
301

Crates.io

getfn

通过指针引用函数的实用工具。

使用 getfn! 宏,你可以生成一对函数:第一个函数充当“获取器”函数,前缀为 getfn_。第二个函数简单地调用函数

use getfn::getfn;

getfn! {
	(|| { println!("hi!"); })
	fn my_func();
}

my_func(); // hi!
let f = getfn_my_func();
f(); // hi!

你可能想知道为什么不用 let f = my_func; 而是使用单独的获取器。原因是 f 中的结果函数指针不会与 getfn! 传入的地址完全相同。这在游戏修改等情况下是必要的,在这种情况下,为了 挂钩 函数,你必须有它的确切地址。为了帮助这些用例,getfn 还提供了一个 get_addr! 宏,它是一个用于获取函数地址的 DSL

// gets the base address of the `MyGame.exe` module using the backend
// specified via features (currently supported are `winapi` and `libc`).
let f = getfn::get_addr!("MyGame.exe" + 0x20bf00);

这些可以使用 symbol_fn! 宏组合在一起

use getfn::symbol_fn;
use std::ffi::c_void;

symbol_fn! {
	("MyGame.exe" + 0x20bf00)
	extern "C" fn my_game_func(a: i32) -> bool;
}
println!("{}", my_game_func(5));

let func = getfn_my_game_func();

extern "C" fn detour(a: i32) -> bool { a == 5 }

// .. hook `func` ..
let mut orig = std::ptr::null_mut();
MH_CreateHook(func as *mut c_void, detour, &mut orig as *mut _ as _);

许可

许可如下

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖