在 x86 中,您只需使用以下 3 条指令即可注册处理程序。
push addrOfExceptionHandler
push dword [fs:0]
mov [fs:0],esp
但这在 64 位 Windows 上不起作用。
我已经读到 x64 异常处理程序是基于表的,并且 Visual C++ 的 __try
和 __ except
block 被硬连接到异常目录中。这是否意味着微软彻底放弃了这种旧方法?那么有没有办法从代码中以编程方式注册处理程序?
最佳答案
Windows x64 使用基于表的异常处理(与使用基于帧的处理的 x86 不同)。
每个图像都有一个与其关联的RUNTIME_FUNCTION
结构表(通常由编译器生成)。该结构基本上描述了图像中的函数(或其部分),并包含有关如何在该函数中展开堆栈的信息。它还可能包含有关应在函数内调用的异常处理程序的信息。
当异常发生时,系统会查找属于发生异常的图像的表,并使用该表遍历/展开堆栈,直到遇到可以处理异常的异常处理程序。
这意味着您不能再使用[fs:0]
进行异常处理程序注册。
尽管可以为加载/生成的图像生成RUNTIME_FUNCTION
表,然后通过RtlAddFunctionTable
或RtlInstallFunctionTableCallback
API注册它。
您可以在 Nynaeve's blog 找到有关 Windows x64 异常处理的好文章.
MSDN 还包含有关 Exception Handling (x64) 使用的结构的文章.
关于windows - 如何在 Windows 上的 x86-64 架构上的程序集中注册结构化异常处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926085/