C 手动安装的SEH不';不要在内部块中工作

C 手动安装的SEH不';不要在内部块中工作,c,winapi,seh,C,Winapi,Seh,读后 在这里的一些帖子中,我实现了一个非常基本的版本。 我唯一的要求是能够“捕获”任何异常(仅“Win32”,因为我不会抛出/引发任何异常) 然后退出引发它的线程。 我有一个正确的原型函数,它只调用“ExitThread”,还有一个“EXCEPTION\u REGISTRATION”结构,它在它的handler属性中包含它,而实际的前一个句柄在previous属性中。 设置此处理程序的操作是调用: BOOL set_my_handler(){ EXCEPTION_REGISTRATION* p_

读后 在这里的一些帖子中,我实现了一个非常基本的版本。 我唯一的要求是能够“捕获”任何异常(仅“Win32”,因为我不会抛出/引发任何异常) 然后退出引发它的线程。 我有一个正确的原型函数,它只调用“ExitThread”,还有一个“EXCEPTION\u REGISTRATION”结构,它在它的handler属性中包含它,而实际的前一个句柄在previous属性中。 设置此处理程序的操作是调用:

BOOL set_my_handler(){
EXCEPTION_REGISTRATION* p_excep = &excep // excep is a global static EXCEPTION_REGISTRATION
__asm{
      mov EAX, p_excep
      mov FS:[0],EAX
 }
 ...
 }
问题: 当我引起异常时(例如:

在我将set_称为my_handler的同一范围内, 我的处理程序按预期被调用。但是,如果我通过调用一个函数在内部块中引发相同的异常,它就是不起作用。我会得到未处理的异常消息框。 在调试时,我注意到FS:[0]在内部函数中保持不变(指向我的处理程序)。 顺便说一句,我没有使用任何(try/catch或try/_,除了在我的代码中)

谢谢你的帮助,谢谢

我问题的答案(感谢陈雷蒙):
事实证明,必须在堆栈上分配异常注册实体,因为有一种安全机制可以根据堆栈段寄存器验证其位置。

安装异常处理程序不仅仅是挂接到fs:[0]。出于安全原因,异常注册必须在堆栈上。详细信息。
* (dword*) 0 = 0;)