Skip to content

MuNET-OSS/ChuModLoader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ChuModLoader

CHUNITHM Mod 加载框架

License Platform Rust ABI Version

通过代理 winhttp.dll,在游戏启动时自动从 mods/ 目录加载 Mod DLL。框架使用 Rust 编写,Mod 可用 Rust 或 C/C++ 开发


目录

功能特性

分类 说明
DLL 代理 代理 winhttp.dll,转发系统 winhttp.dll 的全部导出,对游戏完全透明
自动加载 启动时自动扫描并加载 mods/*.dll
内存操作 内存读写、填充、AOB 特征扫描
Hook Inline hook(创建 / 启用 / 禁用 / 移除)、RTTI vtable 查找
d3d9 服务 代理 Direct3D 9 设备,提供每帧回调、帧率锁定、设备 / 窗口句柄
Mod 间通信 命名服务查找 + 基于 topic 的发布 / 订阅
配置 TOML / INI 单 Mod 配置读写
日志 分级日志(info / warn / error)+ 控制台颜色 + per-mod 日志文件
依赖管理 依赖声明 + 拓扑排序,确保加载顺序
生命周期 init → on_ready → on_frame → shutdown 完整生命周期
热重载 reload_mod API + reload.flag 文件触发
崩溃保护 catch_unwind 包裹回调 + SEH 过滤器 + crash dump + 栈回溯
版本检测 游戏版本检测 + min_loader_version 兼容性检查

工作原理

chusanApp.exe 静态导入了系统 winhttp.dll。ChuModLoader 把自己编译成同名的 winhttp.dll 放在游戏目录,由于 DLL 搜索顺序优先于 System32,游戏启动时会自然加载它。框架再把所有导出转发给真正的系统 winhttp.dll,因此对游戏完全透明。

加载后,框架并不会立刻初始化(此时游戏自身尚未运行)。它在 DllMain劫持游戏 EXE 的入口点:改写入口处的指令,使游戏真正开始执行时先跳转到框架的 bootstrap,完成 Mod 加载、crash dump 安装、d3d9 代理注入后,再恢复原始入口点继续运行游戏。

chusanApp.exe 启动
  └─ 加载游戏目录的 winhttp.dll(实为 ChuModLoader)
       ├─ 转发系统导出 → System32\winhttp.dll
       └─ DllMain:劫持游戏入口点
            游戏入口点首次执行
              └─ bootstrap
                   ├─ 安装 crash dump / SEH
                   ├─ 扫描 mods/*.dll,依赖拓扑排序
                   ├─ 逐个驱动 Mod 生命周期
                   │    init → on_ready → on_frame(循环) → shutdown
                   ├─ 注入 d3d9 设备代理
                   └─ 恢复原始入口点,游戏正常运行

安装

  1. 构建或下载 winhttp.dll
  2. 放到游戏目录(和 chusanApp.exe 同级)
  3. 把 Mod DLL 放进 mods/ 目录
  4. 正常启动游戏

加载日志会写入 chumod_loader.log,单 Mod 日志位于 mods/log/,崩溃报告位于 mods/crash/

目录结构

ChuModLoader/
├─ Cargo.toml        # workspace(成员:chu-abi、loader)
├─ rust-toolchain.toml
├─ chu-abi/          # C ABI 定义(ChuModInfo / ChuModAPI 等共享类型)
│  ├─ Cargo.toml
│  └─ src/
├─ loader/           # 加载器主体,编译产物为 winhttp.dll
│  ├─ Cargo.toml
│  ├─ build.rs       # 生成 winhttp 导出转发
│  └─ src/
│     ├─ lib.rs      # 入口、winhttp 代理、游戏入口点劫持
│     ├─ loader/     # Mod 扫描、依赖排序、日志、生命周期、崩溃处理
│     ├─ api_impl/   # ChuModAPI 函数表实现
│     └─ d3d9/       # Direct3D 9 设备代理
├─ include/
│  └─ chumod.h       # C/C++ Mod 头文件
└─ docs/             # 开发文档

游戏目录下框架运行时使用的布局:

游戏目录/
├─ chusanApp.exe
├─ winhttp.dll                       # ChuModLoader
├─ chumod_loader.log                 # 加载器日志
└─ mods/
   ├─ <mod>.dll                      # Mod 二进制
   ├─ config/<mod_name>.toml         # 单 Mod 配置(或 .ini)
   ├─ manifest/<mod_name>.toml       # 单 Mod manifest
   ├─ log/<mod_name>.log             # 单 Mod 日志
   ├─ crash/                         # 崩溃报告
   └─ reload.flag                    # 创建即触发全部热重载

构建

需要 Rust nightly 工具链 + i686-pc-windows-msvc target(仓库已通过 rust-toolchain.toml 固定):

cargo build --release

输出文件:

target/i686-pc-windows-msvc/release/winhttp.dll

Note

游戏为 32 位程序,必须使用 i686-pc-windows-msvc target,不能用默认的 64 位 target。

Mod 开发

最小的 C/C++ Mod 示例:

#include "chumod.h"

static const ChuModAPI* g_api = NULL;

CHUMOD_API const char* chumod_name(void)    { return "Example Mod"; }
CHUMOD_API const char* chumod_version(void) { return "1.0.0"; }

CHUMOD_API int chumod_init(const ChuModInfo* info, const ChuModAPI* api) {
    (void)info;
    g_api = api;
    g_api->log_info("Example Mod 已初始化");
    return 0; // 返回 0 保留加载,非 0 跳过卸载
}

CHUMOD_API void chumod_shutdown(void) {
    if (g_api) g_api->log_info("Example Mod 已卸载");
}

将其编译为 32 位 Windows DLL 后放入 mods/ 即可。完整的 Rust / C++ 示例、生命周期、配置、热重载等说明见开发文档。

文档

许可证

Apache-2.0

About

Mod loader framework for CHUNITHM

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors