2024 年 7 月 13 日:
- 创建名为 EmperorLauncher 的补丁,可修改 Emperor: Battle for Dune 使其在现代系统上运行良好,具备高分辨率支持、可直接 IP 连接的在线多人游戏和合作战役模式。可在此处下载补丁,源代码在github。
- Emperor: Battle for Dune 介绍:2001 年由 Westwood Studios 制作的实时战略游戏,是 Dune 2000 的续集,被认为是 RTS 类游戏的鼻祖,虽深受喜爱但如今不太知名,因被 Westwood 其他 RTS 系列 Command & Conquer 掩盖。
- 存在的问题:游戏无法在现代屏幕的高分辨率下运行,多人游戏模拟速度无上限,Westwood Online 不可用,无法在合作模式下进行战役,安装程序损坏,许多视觉效果在现代 PC 的高帧率下出错。
如何修复:
- 初始目标是制作 Emperor.exe 的替代品以控制 Game.exe 的启动,后发现 Emperor.exe 在运行 Game.exe 前会创建互斥体和匿名文件映射句柄,通过 IPC 消息传递系统将句柄值传递给子进程,从而实现数据传递。
- 利用 CreateRemoteThread 和 LoadLibrary 技巧注入自定义补丁到 Game.exe 中,使用 detours 库修补函数,解决函数替换和保留原始函数指针等问题。
- 修补图形部分,解决高分辨率窗口和限制帧率问题,包括引入代码解决 Direct3D7 的分辨率限制,通过补丁去除窗口边框并重新定位游戏窗口,以及修补 IDirect3DDevice7::EndScene 方法限制帧率。
- 修补网络部分,实现 WOL 模式下的多人游戏,包括设置假的 WOL 主服务器、代理游戏数据包、拦截 winsock 函数等,解决端口随机选择和 NAT 打孔等问题。
打包:
- 替换损坏的安装程序,通过复制安装 CD 内容和提取.cab 文件来完成基本安装,通过分析嵌入式 DLL 实现补丁到 v1.09。
- 打包 Westwood Online Shared Internet Components,通过重定向注册表并使用 OaEnablePerUserTLibRegistration 函数进行注册。
- 制作基本的启动器 UI,使用 plain old win32 实现,简单静态。
- 结论:基本实现目标,感谢阅读,希望玩家喜欢游戏。
补充说明:
- Detours 还处理 CreateRemoteThread 和 LoadLibrary 技巧。
- 解决高分辨率问题的代码是一个疯狂的 hack,可能不稳定。
- 鼠标偏移在 4:3 模式下也存在但影响较小。
- 每个 Windows 可执行文件都以 DOS 可执行文件开头。
- 尝试直接使用 DllGetClassObject 函数从 DLL 注册类库未成功。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。