1- use std:: ffi:: { c_char, c_void} ;
1+ //! ChuMod ABI
2+ //!
3+ //! ChuModLoader与 Mod 共同依赖此 crate
4+ //!
5+ //! ABI 安全约束 :
6+ //! - 跨边界结构 `#[repr(C)]`,仅用定宽整型 / 裸指针;
7+ //! - 禁止跨边界使用 Rust `bool`/`Vec`/`String`/slice/trait object/无显式 repr 枚举;
8+ //! - chumod 回调表统一 `extern "C"`(i686 cdecl),不可改 stdcall,否则爆栈;
9+ //! - 仅 append-only 增长:永不重排字段、不缩类型、不改回调签名;
10+ //! - 新字段靠 `ChuModAPI::struct_size` 向后兼容
211
3- pub const CHUMOD_API_VERSION : u32 = 3 ;
12+ #![ no_std]
13+ #![ allow( non_camel_case_types) ]
14+
15+ use core:: ffi:: { c_char, c_void} ;
16+
17+ /// 当前 ABI 版本 v4:d3d9 服务
18+ pub const CHUMOD_API_VERSION : u32 = 4 ;
19+
20+ /// Loader 版本
421pub const LOADER_VERSION : & str = "1.0.0" ;
522
23+ /// 传给 `chumod_init` 的运行时信息(append-only)
624#[ repr( C ) ]
725pub struct ChuModInfo {
826 pub api_version : u32 ,
@@ -14,22 +32,38 @@ pub struct ChuModInfo {
1432 pub text_size : u32 ,
1533 pub rdata_base : usize ,
1634 pub rdata_size : u32 ,
17- pub game_version : * const c_char ,
1835}
1936
37+ pub type ChuModInitFunc = unsafe extern "C" fn ( * const ChuModInfo , * const ChuModAPI ) -> i32 ;
38+ pub type ChuModReadyFunc = unsafe extern "C" fn ( ) ;
39+ pub type ChuModFrameFunc = unsafe extern "C" fn ( ) ;
40+ pub type ChuModShutdownFunc = unsafe extern "C" fn ( ) ;
41+ pub type ChuModNameFunc = unsafe extern "C" fn ( ) -> * const c_char ;
42+ pub type ChuModDependsFunc = unsafe extern "C" fn ( ) -> * const c_char ;
43+ pub type ChuModStringFunc = unsafe extern "C" fn ( ) -> * const c_char ;
44+
45+ /// 每次 Present 调用(FPS OSD 等) 参数为原生 `IDirect3DDevice9*`
46+ pub type ChuModPresentCallback = unsafe extern "C" fn ( device : * mut c_void ) ;
47+ /// 设备 Reset 事件 `phase`: 0 = Reset 前(释放 D3DPOOL_DEFAULT),1 = Reset 成功后(重建)
48+ pub type ChuModResetCallback = unsafe extern "C" fn ( device : * mut c_void , phase : u32 ) ;
49+
50+ /// Loader 提供给 mod 的 API 函数表(append-only;用 `struct_size` 判断可用字段)
2051#[ repr( C ) ]
2152pub struct ChuModAPI {
2253 pub struct_size : u32 ,
54+
2355 pub log : Option < unsafe extern "C" fn ( * const c_char , ...) > ,
56+
2457 pub aob_scan : Option < unsafe extern "C" fn ( usize , u32 , * const u8 , * const c_char ) -> usize > ,
2558 pub mem_read : Option < unsafe extern "C" fn ( usize , * mut c_void , u32 ) -> i32 > ,
2659 pub mem_write : Option < unsafe extern "C" fn ( usize , * const c_void , u32 ) -> i32 > ,
2760 pub mem_fill : Option < unsafe extern "C" fn ( usize , u8 , u32 ) -> i32 > ,
28- pub hook_create :
29- Option < unsafe extern "C" fn ( * mut c_void , * mut c_void , * mut * mut c_void ) -> i32 > ,
61+
62+ pub hook_create : Option < unsafe extern "C" fn ( * mut c_void , * mut c_void , * mut * mut c_void ) -> i32 > ,
3063 pub hook_enable : Option < unsafe extern "C" fn ( * mut c_void ) -> i32 > ,
3164 pub hook_disable : Option < unsafe extern "C" fn ( * mut c_void ) -> i32 > ,
3265 pub hook_remove : Option < unsafe extern "C" fn ( * mut c_void ) -> i32 > ,
66+
3367 pub register_service : Option < unsafe extern "C" fn ( * const c_char , * mut c_void ) -> i32 > ,
3468 pub get_service : Option < unsafe extern "C" fn ( * const c_char ) -> * mut c_void > ,
3569 pub publish : Option < unsafe extern "C" fn ( * const c_char , * mut c_void , u32 ) -> i32 > ,
@@ -39,7 +73,9 @@ pub struct ChuModAPI {
3973 Option < unsafe extern "C" fn ( * const c_char , * mut c_void , u32 ) > ,
4074 ) -> i32 ,
4175 > ,
76+
4277 pub rtti_find_vtable : Option < unsafe extern "C" fn ( * const c_char ) -> usize > ,
78+
4379 pub config_get_int : Option < unsafe extern "C" fn ( * const c_char , i32 ) -> i32 > ,
4480 pub config_get_float : Option < unsafe extern "C" fn ( * const c_char , f32 ) -> f32 > ,
4581 pub config_get_bool : Option < unsafe extern "C" fn ( * const c_char , i32 ) -> i32 > ,
@@ -49,25 +85,28 @@ pub struct ChuModAPI {
4985 pub config_set_float : Option < unsafe extern "C" fn ( * const c_char , f32 ) -> i32 > ,
5086 pub config_set_bool : Option < unsafe extern "C" fn ( * const c_char , i32 ) -> i32 > ,
5187 pub config_set_string : Option < unsafe extern "C" fn ( * const c_char , * const c_char ) -> i32 > ,
88+
5289 pub log_info : Option < unsafe extern "C" fn ( * const c_char ) > ,
5390 pub log_warn : Option < unsafe extern "C" fn ( * const c_char ) > ,
5491 pub log_error : Option < unsafe extern "C" fn ( * const c_char ) > ,
92+
5593 pub log_path : * const c_char ,
94+
5695 pub toml_section_exists : Option < unsafe extern "C" fn ( * const c_char ) -> i32 > ,
5796 pub toml_get_bool : Option < unsafe extern "C" fn ( * const c_char , * const c_char , i32 ) -> i32 > ,
5897 pub toml_get_int : Option < unsafe extern "C" fn ( * const c_char , * const c_char , i32 ) -> i32 > ,
5998 pub toml_get_float : Option < unsafe extern "C" fn ( * const c_char , * const c_char , f32 ) -> f32 > ,
6099 pub toml_get_string : Option <
61100 unsafe extern "C" fn ( * const c_char , * const c_char , * mut c_char , u32 , * const c_char ) -> i32 ,
62101 > ,
102+
63103 pub get_manifest_path : Option < unsafe extern "C" fn ( ) -> * const c_char > ,
104+
64105 pub reload_mod : Option < unsafe extern "C" fn ( * const c_char ) -> i32 > ,
65- }
66106
67- pub type ChuModInitFunc = unsafe extern "C" fn ( * const ChuModInfo , * const ChuModAPI ) -> i32 ;
68- pub type ChuModReadyFunc = unsafe extern "C" fn ( ) ;
69- pub type ChuModFrameFunc = unsafe extern "C" fn ( ) ;
70- pub type ChuModShutdownFunc = unsafe extern "C" fn ( ) ;
71- pub type ChuModNameFunc = unsafe extern "C" fn ( ) -> * const c_char ;
72- pub type ChuModDependsFunc = unsafe extern "C" fn ( ) -> * const c_char ;
73- pub type ChuModStringFunc = unsafe extern "C" fn ( ) -> * const c_char ;
107+ pub register_present_callback : Option < unsafe extern "C" fn ( Option < ChuModPresentCallback > ) -> i32 > ,
108+ pub register_reset_callback : Option < unsafe extern "C" fn ( Option < ChuModResetCallback > ) -> i32 > ,
109+ pub set_frame_lock : Option < unsafe extern "C" fn ( u32 ) -> i32 > ,
110+ pub get_d3d9_device : Option < unsafe extern "C" fn ( ) -> * mut c_void > ,
111+ pub get_game_hwnd : Option < unsafe extern "C" fn ( ) -> usize > ,
112+ }
0 commit comments