修复了 Windows 10 周年更新 + 最新的 Nvidia / AMD 视频驱动程序崩溃/问题,具体如下:
《辐射:新维加斯》
《辐射:新维加斯》无血腥(德语)
《辐射 3》
《辐射 3:无血腥》(德语)
遗忘
GECK(新维加斯)
GECK(辐射 3)
建筑套装(湮没)
你在玩《新维加斯》的时候遇到过崩溃吗?当然遇到过。我们都遇到过。
我可能有一个解决方案给你:NVAC。
NVAC(New Vegas Anti Crash 的缩写)是一个 NVSE 插件,它实现了结构化异常处理和健全性检查,以减少游戏崩溃的频率。
话虽如此,我并不保证。这并非万能药:它仅尝试修复与特定偏移量/地址的访问冲突异常相关的崩溃。
由于它是一个 NVSE 插件,nvac.dll 位于您的 Data/NVSE/Plugins 文件夹中。
运行《新维加斯》后,您可以通过读取《新维加斯》文件夹中的 nvac.log 文件来确认 NVAC 是否已加载;如果 nvac.log 不存在,请查阅 nvse.log。NVAC 并不完全支持《新维加斯》的德语“无血腥”版本;我根本无法访问它来进行开发。
欢迎在评论区提交 nvac.log 中标有“u”或“v”的异常。它们通常是日志中的最后一条(因为未处理的异常会导致新维加斯崩溃)。对于在 readme 文件中标记为“preliminary”的地址,也请在评论区提交“e”或“s”条目,因为这意味着我尚未亲自验证过它们;记录这些异常时新维加斯应该不会崩溃,因此需要在游戏结束后随意检查日志文件。每次启动新维加斯时,日志文件都会被清除。
作为奖励,NVAC 实现了辅助函数内联(它采用可以容纳在 5 字节空间内的内部 New Vegas 函数,并用 5 字节或更少的指令替换函数调用),这是一个小小的性能改进。
NVAC 可以随时移除。NVAC 并非普通的 New Vegas 模组(esp/esm 文件);它是一个 NVSE 插件,会在运行时修改游戏的可执行代码,但不会进行任何永久性更改。它所做的任何更改都不会像 esp/esm 模组那样被写入存档。
解密 nvac.log 文件:19195402 _ 00310000 03060000 nvac.dll“19195402”是一个时间戳,可以读作 dd:hh:mm:ss(日、时、分、秒);在本例中为 11 月 19 日,下午 7:54,2 秒。
“_”是一个用于标识日志条目类型的单字母代码,我稍后会详细说明。
“00310000”是内存地址;对于大多数条目来说,这是异常(崩溃)的地址。
“03060000”是一个信息值;在本例中,nvac.dll 的版本号
“nvac.dll”是在记录的地址加载的模块。
19123249 u 0044AD6B C0000005 FalloutNV.exe“19123249”(11月)19日下午12点32分49秒。
“你”未处理的异常。
“0044AD6B”发生异常的地址。
“C0000005”异常代码(EXCEPTION_ACCESS_VIOLATION)。
“FalloutNV.exe”游戏代码中发生异常。
字母代码:“_”条目提供信息,传达已加载的 NVAC 和各种 DLL 的基地址。
“!”条目信息丰富,为用户传达人类可读的文本。
“一个”条目是由 NVAC 的“全局”异常处理程序自动处理的异常。
“e”条目是 NVAC 的目标代码更改专门处理的异常。
“f”通过 NVAC 的针对性代码更改,可以避免条目冻结(挂起)。
“h”条目是 NVAC 的“全局”异常处理程序启发式识别的异常,有时处理不成功。
“我”条目是辅助函数内联错误,指示数据不匹配。
“米”条目是“无处不在”的异常,有时处理不成功。
“ñ”条目是空指令异常,有时处理不成功。
“n”条目是空指针调用异常,有时处理不成功。
“哦”条目是堆栈溢出异常,通常处理不成功。
“q”条目是程序自我终止信息;这些实际上是崩溃。
“r”条目提供信息,传达下一个回邮地址。
“s”条目是防止异常的健全性检查。
“t”条目信息丰富,传递线程信息。
“你”条目是未处理的异常过滤器报告的未处理的异常;这些都是崩溃。
“v”条目是 NVAC 的“全局”异常处理程序报告的未处理的异常;这些是崩溃。
“w”条目是信息性的,在通过新维加斯的最终异常处理程序时传递异常信息。
“x”条目是 Windows 异常数据中的严重错误;这些条目永远不应该出现。
“@”条目是传递附加异常信息的 beta 构建条目。
“#”条目是传递附加函数挂钩信息的测试版构建条目。
“^”条目提供信息,将可能的返回地址从外部库代码传递到主代码。
“:”条目是从 OutputDebugString 调用输出的。
“;”条目是从游戏自己的错误检查输出的。
致模组开发者的提示:我强烈建议在开发模组时禁用 NVAC(通过您的模组管理器或从您的 Data/NVSE/Plugins 文件夹中删除 nvac.dll),以确保 NVAC 不会抑制您的模组导致的任何崩溃,并且可以由您自行解决。
更新日志:7.5.1.0
- 修复了使用 Mod Organizer 时与 TTW 一起自动安装的兼容性问题。感谢 DarianStephens 的贡献。
- nvac.dll 没有变化(与 7.5.0.0 相比)。
7.5.0.0
- Win10AU 修复。
- 增加了通过 mod 管理器安装 Fallout 3、Oblivion 和 Skyrim 的支持。
- 添加了 Windows 版本以记录输出。
- 增加了对地址 00B57AA9 的支持。
7.4.0.0
- 内部代码清理和小规模重构。
- 为日志输出添加了简单的线程安全性,以避免罕见的混乱日志输出。
- 增加了对 TEST 指令的启发式检测支持。
- 增加了对更多 x87 FPU 指令的启发式检测支持。
- 增加了对 MOVSW 和 LODSW 指令的启发式检测支持。
- 增加了与地址 00C670CE 相关的 Havok 物理崩溃的支持。
- 增加了对 InterlockedCompareExchange 的 NVSR 变体的支持。
- 改进了 ntdll.dll 中发生特定异常时的日志记录。
- 游戏内控制台命令将日志输出切换至控制台(在控制台中输入“nvac”)。
- 通过 PCB 进行内存清除,以尝试对地址 00AA55A6 进行异常恢复。
- 添加了插件加载期间的异常处理。
- 将一些“!”日志条目更改为“_”以反映其信息性而非感叹性。
- 内联更多辅助函数。
- 完善更多辅助功能。
- 增加了强制加载特定着色器包的功能;如果 Data\Shaders\shaderpackage%03i.sdp 存在,它将覆盖其他包。
- 添加了 CrashSave 生成;在某些情况下,当 NVAC 无法防止崩溃时,将发生保存。
- CrashSaves 在加载游戏菜单中有一个“CRASH”标签(如果没有 NVAC,它们将有一个“SYS”标签)。
- CrashSaves 只能作为最后的手段使用(在某些情况下它们可能包含坏数据,例如无效的玩家 FaceGen 数据),但可以作为一种选择(例如,如果您在 4 小时内没有保存并且想要尝试继续)。
7.2.1.0
- 修复了错误指针调用恢复中的逻辑缺陷。
- 对游戏错误消息记录进行了更多更改;这些更改可能会进一步改变。
7.2.0.0
- 增加了对另一条指令的启发式检测支持。
- 改进了坏指针调用恢复和相关日志条目。
- 改进了堆栈溢出恢复(略微)。
- 添加了与地址 00AA9A41 相关的异常的内存不足测试。
- 添加了 SEH 挂钩失败的日志输出。
- 完善了一个辅助函数。
- 内联另外三个辅助函数。
7.1.0.0
- 增加了对 MOVSS 的启发式检测支持。
- 增加了与地址 005E572B 相关的挂起支持。
- 增加了与地址 005E58BD 相关的挂起支持。
- 将内存不足测试敏感度从 8 MB 更改为 16 MB。
- 对游戏错误消息记录进行了更多更改;这些更改可能会进一步改变。
- 少量代码优化。
7.0.0.0
- NVAC 内部大量代码清理和重组。
- 增加了对另外 10 条指令的启发式检测支持。
- 使目标代码更改 SEH(“e”条目)更加健壮。
- 提高了健全性检查(“s”条目)的效率。
- 改进了新维加斯自我终止的日志记录(“q”条目)。
- 添加日志输出以识别主代码调用外部库代码的位置(“^”条目)。
- 更改了特定 ntdll.dll 异常的快速退出。
- 删除了对 16 个地址的目标支持;它们现在会自动处理:
- 0043C47A、0045840A、004A408A、004A995D、004FD3CA、0057E141、0061387D、006BF460
- 008A5328、0094E607、00A02F52、00A09FCA、00A2FC8D、00A5E378、00AA6F14、00D0D7D8
6.9.0.0
- 增加了对 MOVAPS / MOVUPS / MOVDQA / MOVDQU XMM?、OWORD PTR [?] 的启发式检测支持。
- 改进了从空指针调用、空指令和中间异常的恢复。
- 改进了空指针调用恢复失败的日志输出。
- 删除了对地址 00401992 的支持;它很慢,现在可以自动处理。
- 缩小了缺少主控(0046158A)错误的输出消息的情况。
- 改进了恢复并添加了带有 LOD(006FCF03)错误的禁用对象的日志输出。
- 添加了与地址 00D1F29C 相关的异常的内存不足检查。
- 对游戏错误消息记录进行了更多更改;这些更改可能会进一步改变。
6.8.0.0
- 添加了与地址 00AAA60A 相关的异常的内存检查。
- 使日志截断阈值更小(从 16 KB 到 8 KB)。
- 对游戏错误消息记录进行了更多更改;这些更改可能会进一步改变。
- 少量代码优化。
- 将内联地址列表移至只读数据部分。
6.7.0.0
- 增加了除以零异常支持。
- 添加了初步的堆栈溢出异常支持;这将得到改进。
- 增加了游戏 INI 设置长度限制(针对 sArchiveList,从 255 到 8191)。
- 改变了特定的游戏错误消息记录;这些可能会进一步改变。
- 少量代码优化。
6.6.0.0
- 增加了对以 DD 开头的 x87 指令的启发式检测支持。
- 增加了保护页面异常支持(包括保护页面恢复)。
- 修复了空指针调用恢复失败的日志输出。
- 使两次挂起检测更加保守。
- 解决了与 NVSE 的 EnableGameErrorLog 设置的冲突。
- 实现了特定的游戏错误消息记录;这些可能会改变。
6.5.1.0
- 修复了 NVAC 脚本扩展插件查询和加载功能中的一个错误。
6.5.0.0
- 感谢 beta 测试人员。
- 将草地渲染范围扩大 1 个单元格距离;受 fGrassStartFadeDistance 影响。
- 从最后一次机会 DirectX 重置恢复中删除了睡眠功能;这没有帮助。
- 删除了对地址 008256D9 的支持;它很慢,现在可以自动处理。
- 修复了 IAT 修补代码中的一个纯理论错误。
- 增加了与地址 00C3E159 相关的挂起支持。
- 添加了与地址 00A5BA62 相关的挂起的日志输出。
- 增加了程序自行终止的日志输出。
- 增加了对 EXCEPTION_ILLEGAL_INSTRUCTION 和 EXCEPTION_PRIV_INSTRUCTION 的支持。
- 增加了对另外 49 条指令的启发式检测支持。
- 内联另外六个辅助函数。
- 改进(优化)了三个辅助功能。
- 改进了特定的浮点零测试(39 个位置)。
6.4.0.0
- 添加了与地址 00ED2C9E 相关的异常的内存不足检查。
- 添加了最低睡眠时间以作为最后一次 DirectX 重置恢复的机会。
- 改进了从空指针调用、空指令和中间异常的恢复。
- 修复了以 D8 开头的 x87 指令的启发式检测支持。
- 内联一个辅助函数。
6.3.0.0
- 添加了第三方库进行的 OutputDebugString 调用的日志输出。
- 添加了不可持续异常的日志输出。
- 改进了对齐指令错位与访问冲突异常的检测。
- 增加了对以 D8 开头的 x87 指令的启发式检测支持。
- 增加了对另外 2 起已报告崩溃的启发式检测支持。
- 为“!”条目添加了适当的日志输出功能。
- DirectShow Filter 过滤的初步基础。
6.2.5.0
- 对各种挂起修复进行了更改。
- 增加了对 MOVQ / MOVDQA / MOVDQU 的启发式检测支持。
- 添加了级别列表错误的日志输出。
6.2.0.0
- 初步支持地址 00B63EFF。
- 改进了对地址 00E8C00B 的支持。
- 增加了对 920 条指令的启发式检测支持。
- 删除了 5.8.0.0 版本中添加的资产加载挂起支持。
- 增加了两个潜在挂起的日志输出。
- 内联另外两个辅助函数。
6.1.0.0
- 增加了对数百条指令的启发式检测支持。
- 改进了 MOVAPS 的处理。
- 对各种挂起修复进行了更改。
- 添加了与地址 00AA55A6 相关的异常的内存不足检查。
- 删除了对 NVSE 3b2 的针对性支持(现在有更新的版本)。
- 内联了 20 多个辅助函数。
6.0.0.0
- 新增数百条指令的启发式检测支持。感谢 Beta 测试人员。
- 初步支持另一个资产加载挂起。
- 彻底检查了“全局”异常处理程序中的指令解析器。
- 改进了主机进程(通常是 FalloutNV.exe)的识别。
- 在无限循环的情况下,日志将不再变得巨大。
5.9.0.0
- 增加了对另外十条指令的实验启发式检测支持。
- 内联另外两个辅助函数。
5.8.0.0
- 初步支持资产加载挂起。
- 内联另外两个辅助函数。
- 少量代码优化。
5.7.0.0
- 初步支持地址 005E0F16。
- 初步支持地址 006BF48E。
- 初步支持地址 00E8C00D。
- 增加了对另外十条指令的启发式检测支持。
- 内联另外两个辅助函数。
5.6.0.0
- 增加了对另外八条指令的启发式检测支持。
- 增加了对空指令异常的恢复尝试。
- 初步支持与信号量使用相关的挂起。
- 各种内部 NVAC 功能的效率略有提高。
- 添加了针对特定 oleaut32.dll 异常的日志输出。
- 改进了日志输出。
5.5.0.0
- 初步支持地址 004B068D。
- 添加了备份 SEH 挂钩机制。
- 添加了序数导出,以允许基准测试实用程序直接计时 NVAC 的异常处理程序。
- 内联另外五个辅助函数。
- 少量代码优化。
5.4.1.0
- 与 NVAC 基准测试实用程序相关的小更新。
5.4.0.0
- 在可选文件区域添加了一个实用程序来对 NVAC 异常处理程序的速度进行基准测试。
- 缩小了对特定新维加斯挂件的支持范围。
- 增加了对另外 18 条指令的启发式检测支持。
- 将内联地址列表移至代码部分的末尾。
- 改进了日志输出。
5.3.0.0
- 初步支持地址 005A8EE0。
- 扩大了对特定新维加斯挂件的支持。
- 增加了对另外 23 条指令的启发式检测支持。
- 将一些启发式检测比较转换为跳转表。
- 内联一个辅助函数。
- 删除了导入跳转表。
5.2.0.0
- 增加了对 GECK 地址 00936733 的支持。
- 修复了新维加斯游戏中的一个特定挂起问题;ntdll.dll 问题。感谢 commoner31。
- 增加了对另外三条指令的启发式检测支持。
- 内联了另外四个辅助函数。
- 改进了日志输出。
5.1.0.0
- 初步支持地址 00804432。
- 删除了地址 00A61693 的初步状态。
- 增加了对另外两条指令的启发式检测支持。
- 增加了对 GECK 版本 1.4.0.518 的支持并修复了 Head Preview 崩溃问题。
5.0.0.0
- 初步支持地址 006F47FC。
- 日志记录现在使用“f”条目来记录避免的挂起/冻结。
- 更改了特定 ntdll.dll 异常的快速退出。
- 改进了特定 ntdll.dll 异常的日志输出。
- 增加了对另外三条指令的启发式检测支持。
- 内联了另外四个辅助函数。
- 提高了代码修补的速度。
4.9.0.0
- 更改了地址 0051E2EA 的异常恢复。
- 初步支持地址 0064DAD6。
- 修复了特定的新维加斯挂起(希望如此);不是 ntdll.dll 挂起。
- 针对特定的 ntdll.dll 异常,使快速退出更加积极。
- 改进了特定 ntdll.dll 异常的日志输出。
- 一些小的效率改进和代码重组。
4.8.0.0
- 初步支持地址 00A61693。
- 将特定 ntdll.dll 异常的挂起更改为快速退出。
- 日志记录现在包括 NVSR 快速退出的条目。
- 修复了与地址 00401992 相关的错误日志输出。
- 改进了与地址 00AA55A6 相关的日志输出。
4.7.0.0
- 初步支持地址 006B43FC。
- 初步支持地址 006B96CC。
- 日志记录现在包括“丢失主服务器(0046158A)”崩溃的条目。
4.6.0.0
- 初步支持地址 005595B1。
- 初步支持地址 00AAA60A。
- 增加了对另外五条指令的启发式检测支持。
- 内联另外三个辅助函数。
4.5.1.0
- 修复了 4.5.0.0 中导致新维加斯无法启动的错误。
4.5.0.0
- 初步支持地址 00EC61FD。
- 初步支持地址 00EC6225。
- 增加了对另外六条指令的启发式检测支持。
- 日志记录现在包括成功退出的条目(但不包括 NVSR 的快速退出)。
- 内联另外两个辅助函数。
4.4.0.0
- 再次更改了地址 00AA55A6 的异常恢复。
- 更改了特定 ntdll.dll 异常的异常恢复。
- 改进了日志输出。
4.3.0.0
- 稍微改变了主要的 SEH 钩子。
- 增加了对另外四条指令的启发式检测支持。
- 增加了对 NVAC 异常处理程序中异常的支持。
- 增加了“荒无人烟”异常的恢复尝试。
4.2.0.0
- 初步支持地址 006BF460。
- 增加了对另外十条指令的启发式检测支持。
- 内联另外三个辅助函数。
- 将内联地址列表移至代码部分。
4.1.0.0
- 增加了对另外十条指令的启发式检测支持。
4.0.0.0
- 实现了额外的 SEH 钩子;这应该可以捕获更多未处理的异常。
- 增加了对另一条指令的启发式检测支持。
- 各种内部 NVAC 功能的效率略有提高。
- 日志现在列出了“n”个条目中阻止的原始崩溃地址的位置。
- 内联另外两个辅助函数。
3.9.0.0
- 更改了地址 00440DAA 的异常恢复。
- 增加了对另外三条指令的启发式检测支持。
- 增加了对地址 00000000 的调用的恢复尝试。
- 内联十多个辅助函数。
3.8.0.0
- 再次更改了地址 00AA55A6 的异常恢复。
- 更改了地址 006BF1DA 的异常恢复。
- 更改了地址 00EC621F 的异常恢复。
3.7.0.0
- 再次更改了地址 00AA55A6 的异常恢复。
- 初步支持地址 004A995D。
- 初步支持地址 006A870C。
3.6.0.0
- 再次更改了地址 00AA55A6 的异常恢复。
- 增加了对地址 0045840A 的支持。
- 初步支持地址 0094E607。
- 初步支持地址 00A2FC8D。
- 初步支持地址 00A5E378。
- 初步支持地址 00D1F29C。
- 内联另外两个辅助函数。
3.5.0.0
- 再次更改了地址 00AA55A6 的异常恢复。
- 恢复对地址 0043C47A 的支持。
- 初步支持地址 00AAA62E。
- 内联另外三个辅助函数。
3.4.0.0
- 恢复对地址 006ADB69 的初步支持。
- 恢复对地址 006FCF03 的初步支持。
- 初步支持地址 00440DAA。
- 初步支持地址 004A408A。
- 初步支持地址 00559506。
- 初步支持地址 0057E141。
- 初步支持地址 008256DC。
- 初步支持地址 008A5328。
- 初步支持地址 00AA6F14。
- 删除了 NVSE 偏移 000443B8 的初步状态。
- 内联另外两个辅助函数。
- 修复与 SEHOP 的兼容性。
3.3.0.0
- 完成了函数内联与全局异常处理程序的集成。
- 增加了对地址 004FD3CA 的支持。
- 初步支持地址 00401992。
- 初步支持地址 00D0D7D8。
- 内联另外两个辅助函数。
3.2.0.0
- 暂时删除了对地址 006ADB69 的支持。
- 暂时取消了对地址 006FCF03 的支持。
- 删除地址 0051E2EA 的初步状态。
3.1.0.0
- 修复了对地址 0061387D 的支持。
- 辅助函数内联的初步实现。
3.0.0.0
- 实现了更有效的处理简单异常的方法。
- 增加了对地址 0065893A 的支持。
- 初步支持地址 0054546F。
- 初步支持地址 0061387D。
- 初步支持地址 006ADB69。
- 初步支持地址 006FCF03。
- 初步支持地址 00C9E64E。
2.9.0.0
- 更改了地址 00AA55A6 的异常恢复。
- 初步支持地址 0057C876。
- 初步支持地址 006A7F22。
- 初步支持地址 006BF1DA。
- 初步支持 NVSE 偏移 000443B8。
2.8.0.0
- 增加了对地址 009611EA 的支持。
- 初步支持地址 00405440。
- 初步支持地址 006B9102。
- 初步支持地址 00A02F52。
- 初步支持地址 00A09FCA。
- 初步支持地址 00EC621F。
- 删除了 NVSE 偏移 00020A07 的初步状态。
- 改进了模组管理器支持。感谢 freddy_farnsworth。
2.7.0.0
- 增加了对地址 0043C47A 的支持。
- 初步支持地址 0051E2EA。
- 初步支持 NVSE 偏移 00020A07。
- 删除了地址 00A61A74 的初步状态。
- 将 NVSE 信息添加到日志输出。
2.6.0.0
- 增加了对地址 0072607A 的支持。
- 初步支持地址 006B3542。
- 初步支持地址 006F3F52。
- 地址 0045CD6A 的初步状态已删除。
- 删除地址 0084E3AA 的初步状态。
2.5.0.0
- 初步支持地址 0045CD6A。
- 初步支持地址 00AA55A6。
- 向 zip 文件添加了最简自述文件。
2.4.0.0
- 初步支持地址 0084E3AA。
- 增加了通过 mod 管理器安装的支持(希望如此)。
- 日志现在列出了“e”和“s”条目中阻止的原始崩溃地址的位置。
- 日志记录现在列出了异常地址的模块文件名。
2.3.0.0
- 初步支持地址 00A61A74。
- 改进了日志输出(在我想要放置空格的地方写入了一些 NULL)。
2.2.0.0
- 日志记录现在有一个有意义的时间戳(ddhhmmss,日:时:分:秒)。
- 未处理的异常现在会被记录。请在评论区提交。
2.1.0.0
- 添加了日志记录(到新维加斯文件夹中的 nvac.log)。
- 应用更改之前改进了兼容性测试。
- 稍微减少异常恢复时的卡顿。
2.0.0.0
- 首次公开发布。