在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
表,然后通过RtlAddFunctionTable
或RtlInstallFunctionTableCallback
API进行注册。
你可以在Nynaeve的博客上找到关于Windows x64异常处理的好文章。
另外MSDN包含和用于异常处理(x64)的结构文章。