fylhtq7779/city-car-driving-button-fix

GitHub: fylhtq7779/city-car-driving-button-fix

该补丁工具移除了 City Car Driving 1 的 DirectInput 32 按钮限制,使现代模拟赛车方向盘和控制器上的全部按钮均可正常绑定。

Stars: 0 | Forks: 0

🇬🇧 English | [🇷🇺 Русский](README.ru.md)
# City Car Driving — Button Limit 修复 **在 City Car Driving 1 中绑定现代模拟赛车方向盘和控制器上编号超过 #32 的按钮。** [![License](https://img.shields.io/github/license/fylhtq7779/city-car-driving-button-fix?style=flat)](LICENSE) [![Release](https://img.shields.io/github/v/release/fylhtq7779/city-car-driving-button-fix?style=flat)](../../releases/latest) [![Downloads](https://img.shields.io/github/downloads/fylhtq7779/city-car-driving-button-fix/total?style=flat)](../../releases) ![Platform](https://img.shields.io/badge/platform-Windows-0078D6?style=flat&logo=windows&logoColor=white) ![Game](https://img.shields.io/badge/game-City%20Car%20Driving%201.5.12-orange?style=flat) ![Reversible](https://img.shields.io/badge/install-reversible-brightgreen?style=flat)
Before the fix only buttons 1–32 bind; after the fix every button binds ## 问题描述 City Car Driving 1 运行在一个老旧的引擎上,它通过 **DirectInput** 读取方向盘和游戏手柄,并使用经典的 **32 按钮**布局 (`DIJOYSTATE`)。对于游戏而言,任何索引超过 32 的按钮都不存在——绑定界面对其完全没有任何反应。 在现代硬件上,这涉及到你大部分的按钮。例如在 **MOZA R5** 上,右侧的按钮索引超过了 32,因此它们根本无法被绑定。游戏也从未发布过更新来修复这个问题。 ## 此修复的功能 - **移除 32 按钮限制** — 修补 `IO.dll` 以暴露多达 **80 个按钮**,并扩展输入派发机制来处理它们。 - **让修补后的游戏能够启动** — 中和启动器 `starter.exe` 中的自身完整性检查(否则它会拒绝运行并提示“某些文件已损坏”)。 - **修复随后的崩溃问题** — 修复 `gui_ccd.dll` 中一个潜在的 null/`-1` bug,如果不修复,更多的按钮数量在加载时会触发此崩溃。 - **不随意篡改其他内容** — 不会重新分发任何游戏文件,所有更改都是本地的字节差异修改,每个文件都会进行备份,并且只需一键即可完全还原。 ## 兼容性 | 游戏版本 | 引擎 | 操作系统 | 测试硬件 | 状态 | |---|---|---|---|---| | 1.5.12 | Nebula / Mangalore | Windows | MOZA R5 + ODDOR‑GEAR shifter | ✅ 正常工作 | ## 安装说明 1. 从 **[Releases](../../releases/latest)** 下载最新版本的压缩包并解压到任意位置。 2. 双击 **`install.bat`**。它会自动查找游戏,备份原始文件,应用补丁并验证结果。 3. 启动游戏 → **Controls** → 双击一个操作 → 按下以前没反应的那个方向盘按钮。现在它就可以绑定了。
游戏不在 Steam 中,或者安装在不寻常的位置? 补丁程序会按以下顺序搜索:Steam 注册表项和**每一个** Steam 库、Windows 的“卸载”注册表项、每个驱动器上的常见文件夹,以及可选的深度扫描。如果仍然找不到游戏,它会提示你**将游戏文件夹拖动到窗口上**(或粘贴路径)。你也可以直接指定路径: ``` powershell -ExecutionPolicy Bypass -File patcher\patcher.ps1 -Mode apply -GamePath "D:\Games\City Car Driving" ```
## 还原 / 卸载 双击 **`revert.bat`** —— 它会从自动备份中还原原始文件。(Steam 用户也可以使用 **验证游戏文件完整性**。)这样就可以了;不会留下任何残余文件。 ## 安全性及其修改内容 - **不附带任何游戏二进制文件** — 此 repo 仅包含字节级别的 diff (`patcher/patches/*.json`) 和补丁程序。 - 在写入任何内容之前,会自动**备份** `IO.dll`、`starter.exe` 和 `gui_ccd.dll`。 - **SHA‑256 验证** — 补丁程序会在打补丁前检查原始文件,并在打补丁后检查结果,如果发现任何不匹配则会中止操作。 - 随时支持**一键还原**。 - City Car Driving 是一款**单机、离线**游戏 — 没有反作弊机制会触发封禁。 - 未签名的补丁程序可能会引起**杀毒软件误报**。完整的源代码位于此 repo 中;请在运行前阅读。 ## 工作原理
简短版本(逆向工程)
这些根本原因是通过静态反汇编 (Capstone) 和 Windows minidump 调用堆栈发现的。共有三处精准的修补: 1. **`IO.dll` — 限制本身。** `CreateJoystick` 调用了 `SetDataFormat(c_dfDIJoystick)`,这是标准的 32 按钮 `DIJOYSTATE` 描述符,而缓冲输入读取器会丢弃第 32 个按钮之后的每一个事件。此修复将一个自定义的 80 按钮数据格式和扩展派发逻辑注入到一个新的 PE section 中(带有正确的基址重定位),将新按钮映射到 POV‑hat 索引范围之外。 2. **`starter.exe` — 篡改检查。** 启动器通过 Botan 签名验证其文件,并计算“已损坏”文件的数量。该计数器的两处读取操作都被强制跳转到*文件正常*的路径 (`je → jmp`)。 3. **`gui_ccd.dll` — 潜在的崩溃。** 一个析构函数解引用了一个使用两个哨兵值 (`0` 和 `-1`) 的句柄,但只对 `0` 进行了防护。修改一个字节 (`je → jle`) 使其能够同时跳过这两种情况。
包含确切偏移量、修改前后字节以及 minidump 调用堆栈的**完整技术分析**:**[docs/TECHNICAL.md](docs/TECHNICAL.md)**。 ## 故障排除
常见问题
- **SmartScreen 警告** — 对于未签名的 `.bat` 文件来说这是正常的。点击 *更多信息 → 仍要运行*。 - **“找不到游戏”** — 在出现提示时将游戏文件夹拖到窗口上,或者传递 `-GamePath` 参数(参见上方的进阶安装)。 - **仍然出现“某些文件已损坏”** — Steam 还原了原始的 `starter.exe`(例如在执行 *验证完整性* 之后)。请重新运行 `install.bat`。 - **“不支持的版本”** — 你的 `IO.dll` 与 1.5.12 版本的内部版本号不同。补丁程序会故意停止运行。请带上报告的哈希值提交一个 issue。 - **加载时仍然崩溃** — 在 [issue](../../issues) 中附带上 `%LOCALAPPDATA%\CrashDumps\starter.exe.*.dmp` 里的最新转储文件。
## 致谢与许可 使用 [Capstone](https://www.capstone-engine.org/) 反汇编和 Windows minidump 分析纯手工打造。与 Forward Development 无任何关联。你必须拥有合法的游戏副本。 基于 [MIT License](LICENSE) 发布。
标签:AI合规, DirectInput, Libemu, 云资产清单, 游戏Mod, 游戏补丁, 输入设备支持, 逆向工程