如何在Windows上的x86-64体系结构中汇编结构化exception处理程序?

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

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

但是这在64位Windows上不起作用。

我读过x64exception处理程序是基于表和Visual C ++的__try__except块硬连接到exception目录。 这是否意味着微软完全放弃了这个老方法? 有没有办法从代码编程注册处理程序呢?

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

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

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

尽管可以为加载/生成的图像生成RUNTIME_FUNCTION表,然后通过RtlAddFunctionTableRtlInstallFunctionTableCallback API进行注册。

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