windows - 如何在 Windows 上的 x86-64 架构上的程序集中注册结构化异常处理程序?

标签 windows assembly 64-bit seh

在 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表,然后通过RtlAddFunctionTableRtlInstallFunctionTableCallback API注册它。

您可以在 Nynaeve's blog 找到有关 Windows x64 异常处理的好文章.
MSDN 还包含有关 Exception Handling (x64) 使用的结构的文章.

关于windows - 如何在 Windows 上的 x86-64 架构上的程序集中注册结构化异常处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926085/

相关文章:

windows - 如何在 cmd 中为 findstr 输出着色?

assembly - 运行代码时出现错误 MIPS “spim: (parser) syntax error”

c++ - Qt 5.4 windows msvc x64 mysql 驱动程序未找到

windows - Windows 的 CVDisplayLink 替代品?

c# - 如何在 Windows 10 通用应用程序开发中使用硬件后退按钮将导航限制到某些页面?

assembly - ESP 在/proc/pid/maps 和二进制文件中不同

linux - 就其第三个参数而言,mprotect() 作为 ASM 系统调用的用法是什么样的?

objective-c - 将 'FLT_EPSILON' 用于 64 位 iPhone 5S

.net - 带有 64 位客户端的 .Net 中的 Oracle

java - 使用java注销计算机