2

在 x86 中,您可以使用以下 3 条指令简单地注册您的处理程序。

push addrOfExceptionHandler
push dword [fs:0]
mov [fs:0],esp

但这不适用于 64 位 Windows。

我已经阅读了 x64 异常处理程序是基于表的,并且 Visual C++__try__except块被硬连接到异常目录中。这是否意味着微软完全放弃了这种旧方法?那么有没有办法从代码中以编程方式注册处理程序?

4

1 回答 1

3

Windows x64 使用基于表的异常处理(与 x86 使用基于帧的处理不同)。

每个图像都有一个RUNTIME_FUNCTION与之关联的结构表(通常由编译器生成)。该结构基本上描述了图像中的函数(或其部分),并包含有关如何展开该函数中的堆栈的信息。它还可能包含有关应在函数内调用的异常处理程序的信息。
当发生异常时,系统会找到一个属于发生异常的图像的表,并使用该表来遍历/展开堆栈,直到它遇到可以处理异常的异常处理程序。

这意味着您不能再[fs:0]用于异常处理程序注册。

虽然可以RUNTIME_FUNCTION为加载/生成的图像生成表格,然后通过APIRtlAddFunctionTable进行注册。RtlInstallFunctionTableCallback

您可以在Nynaeve 的博客上找到有关 Windows x64 异常处理的好文章。
MSDN 还包含有关用于异常处理 (x64)的结构的文章。

于 2015-03-01T11:49:31.010 回答