我正在对 Windows 3.1/95 进行逆向工程游戏从 1995 年开始,这会在启动时将我的显示分辨率更改为 800x600。我想阻止此分辨率更改,而是以窗口模式运行游戏。但是,我无法确定此更改在代码中发生的位置。
当我将 x32dbg 连接到游戏时,我注意到分辨率更改似乎在执行主函数之前就发生了,更具体地说是在 apphelp.dll 中。我在执行分辨率更改的函数中的注册表中发现了以下内容。
edx:L"__COMPAT_LAYER=HighDpiAware", [ebx+8]:L"ForceDisplayMode"
我想了解为什么 Windows 决定使用 800x600 的 ForceDisplayMode 以及如何防止这种情况发生。
答案1
更新 PE 头
我找到了该问题的解决方案,即更新可执行文件的 PE 标头以适应较新版本的 Windows。我尝试了不同的组合,只有使用 Windows 8 值(版本 6.2)才有效。以下是详细步骤:
步骤如下:
- 下载并安装PE编辑器,例如CFF 探索者
- 在 PE 编辑器中打开可执行文件。
- 导航到“可选标题”部分以修改以下字段:
- 主要操作系统版本 -> 6
- 次要操作系统版本 -> 2
- 主要子系统版本 -> 6
- 次要子系统版本 -> 2
- 保存
注意:使用 Windows 7 值仍会导致应用程序调整大小,而使用 Windows 10 值会导致崩溃。将 PE 标头更新为 Windows 8 值(6 和 2)是我发现的唯一成功组合。