0

崩溃指令(其中任何一个都会导致访问冲突):

LODS BYTE PTR FS:[ESI]
LODS WORD PTR FS:[ESI]
LODS DWORD PTR FS:[ESI]

我正在尝试为尝试移植 Windows 95 游戏的客户端修复崩溃,但由于没有可用的源代码,我目前正在汇编中进行调试。该应用程序在 Windows 7 上频繁且随机地崩溃,但在 Windows XP 上运行良好。调试它表示访问冲突,并且在尝试访问 FS 寄存器时发生。

我在 XP 和 Windows 7 上都进行了调试和比较,发现访问冲突发生是因为使用 ESI 访问 FS 寄存器时,在 Windows 7 上地址总是超出范围。我还尝试在汇编代码中添加 SEH 异常处理程序但即使在读取 FS:[0] 时也会发生访问冲突(那里的数据显示为未知):

普沙德
推 004DE918
MOV EAX,DWORD PTR FS:[0]
推EAX

应用程序是否会导致寄存器损坏,但仅在 Windows 7 上而不是 XP 上发生这种情况的可能原因是什么?Windows 7上53的不同FS寄存器选择器与此有关吗?有什么建议或解决方案让我尝试吗?

谢谢!

4

1 回答 1

0

Windows 使用 FS 寄存器快速访问 TIB(线程信息块),也称为 TEB(线程环境块)。FS 将覆盖 TIB 数据结构的段的选择器存储在内存中。我希望这个段的大小非常小,并且由于对任何超出 TEB 大小的地址的访问都将导致一般错误异常。事实上,TEB 数据结构布局和存储在 FS 中的 TEB 地址是没有文档记录的,并且可以由 Microsoft 从版本到版本进行更改。也许 TEB 的大小在 Windows 7 中减小了。

无论如何,为了更有效地讨论这个问题,请提供 FS 和 ESI 在崩溃时刻的值。

于 2013-04-24T01:06:01.940 回答