Windows 11 24H2 意外触发了《侠盗猎车手:圣安地列斯》20 年前的 Bug,如何修复?

去年 10 月,微软正式发布了 Windows 11 24H2 更新,带来了诸如 Copilot 功能改进、对 TAR 和 7z 文件格式的支持、新的节能模式以及更好的更新兼容性等新特性。然而,这一次更新却意外触发了一个沉睡近 20 年的游戏 Bug,影响了经典游戏《侠盗猎车手:圣安地列斯》(GTA: San Andreas)中的水上飞机 Skimmer。

Windows 11 24H2 意外触发了《侠盗猎车手:圣安地列斯》20 年前的 Bug,如何修复?插图

问题的具体表现为:Skimmer 完全从游戏中消失,玩家无法在任何地方找到这架飞机。这一奇怪现象迅速在玩家社区中引发热议,最终引起了知名游戏修复开发者 Silent 的注意。Silent 是 SilentPatch 项目的创建者,该项目专注于修复旧 PC 游戏在现代系统上的运行问题,尤其是《侠盗猎车手》系列。

问题的根源

经过深入调查,Silent 发现了这个 Bug 的真正原因,而它并非源于 Windows 11 24H2 本身,而是《侠盗猎车手:圣安地列斯》代码中的一个长期隐藏的设计缺陷。

Bug 的历史背景

Skimmer 在《侠盗猎车手:罪恶都市》中被归类为船只,因此不需要定义“轮子大小”等参数。然而,在《圣安地列斯》中,Skimmer 被重新分类为飞机,但开发团队忘记更新游戏配置文件 vehicles.ide 中的相关条目。结果,Skimmer 的定义缺少几个关键参数,包括轮子大小。

由于游戏代码没有正确初始化这些缺失参数的变量,导致程序堆栈上未初始化的内存内容被错误地用作 Skimmer 的物理属性值。在过去多年中,这一问题并未显现,因为堆栈内存的布局恰好让 Skimmer 的变量“幸运地”继承了另一个车辆 Topfun 的轮子大小值(0.7)。这种巧合掩盖了 Bug 的存在。

Windows 11 24H2 的影响

Windows 11 24H2 引入了一些内部更改,其中涉及低级函数 LeaveCriticalSection 的行为。这个函数在处理文件逐行读取时,使用了更多的临时堆栈内存。这一微小的变化破坏了原本“幸运”的内存布局,导致 Skimmer 的未初始化变量不再继承 Topfun 的 0.7 值,而是加载了任意数据。这些无效值被用于计算 Skimmer 的物理属性,最终导致其包围盒 Z 坐标出现严重异常,使飞机消失或将玩家角色发射到空中。

解决方法

对于希望尽快解决问题的玩家,可以手动编辑游戏的 vehicles.ide 文件来修复 Skimmer 的定义。以下是具体步骤:

  1. 打开《侠盗猎车手:圣安地列斯》安装目录。
  2. 进入 data 文件夹,找到并打开 vehicles.ide 文件(可使用记事本或其他文本编辑器)。
  3. 查找以 460, skimmer 开头的行。
  4. 将该行替换为以下内容:460, skimmer, skimmer, plane, SEAPLANE, SKIMMER, null, ignore, 5, 0, 0, -1, 0.7, 0.7, -1
  5. 保存文件并重新启动游戏。

完成上述修改后,Skimmer 应该会恢复正常,并在游戏中重新出现。

SilentPatch 的未来更新

Silent 表示,他将在下一个 SilentPatch 更新中正式修复此问题。如果玩家不想手动编辑文件,可以等待 SilentPatch 的新版本发布,并通过安装补丁来自动解决问题。(来源

评论