Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 光纤的SEH设置,异常链验证(SEHOP)处于活动状态_Winapi_Stack_Coroutine_Seh_Fiber - Fatal编程技术网

Winapi 光纤的SEH设置,异常链验证(SEHOP)处于活动状态

Winapi 光纤的SEH设置,异常链验证(SEHOP)处于活动状态,winapi,stack,coroutine,seh,fiber,Winapi,Stack,Coroutine,Seh,Fiber,我正在研究本机光纤/协同路由实现——相当标准,对于每根光纤,分配一个单独的堆栈,为了切换上下文,将寄存器推送到源上下文堆栈上,并从目标堆栈中弹出。它工作得很好,但现在我遇到了一个小问题: 我需要SEH在光纤中工作(如果程序终止或异常开始发生,直到光纤的最后一个堆栈帧才得到处理,这没关系)。只需在上下文切换期间保存/恢复FS:[0](当然还有FS:[4]和FS:[8]),并将新分配的光纤初始设置为0xFFFFFFFF(以便在上下文切换后设置的异常处理程序将成为链的根)就可以了 准确地说,它适用于我

我正在研究本机光纤/协同路由实现——相当标准,对于每根光纤,分配一个单独的堆栈,为了切换上下文,将寄存器推送到源上下文堆栈上,并从目标堆栈中弹出。它工作得很好,但现在我遇到了一个小问题:

我需要SEH在光纤中工作(如果程序终止或异常开始发生,直到光纤的最后一个堆栈帧才得到处理,这没关系)。只需在上下文切换期间保存/恢复
FS:[0]
(当然还有
FS:[4]
FS:[8]
),并将新分配的光纤初始设置为
0xFFFFFFFF
(以便在上下文切换后设置的异常处理程序将成为链的根)就可以了

准确地说,它适用于我测试过的所有非服务器Windows操作系统–问题是Windows server 2008和2008 R2默认启用了异常链验证(SEHOP、SEH覆盖保护)功能,这使得
RaiseException
检查原始处理程序(ntdll.dll中的某个地方)是否仍然是链的根,并立即终止程序,就像没有安装其他处理程序一样

因此,我面临的问题是在堆栈上构造一个适当的根框架,以使验证代码满意。我是否可以调用任何(隐藏的)API函数来实现这一点,或者我是否必须找出使
RtlDispatchException
和朋友高兴并自己构造适当的
\u EXCEPTION\u注册
条目所需的方法?我不能重复使用创建线程提供的Windows,因为它位于错误的地址(SEH实现还检查处理程序地址是否在
FS:[4]
FS:[8]
给定的边界内,还可能检查地址顺序是否一致)


哦,我强烈建议不要使用
CreateFiber
WinAPI函数系列。

我在评论中提到的方法,生成指向
ntdll的伪
EXCEPTION\u注册
条目!FinalExceptionHandler
在实践中似乎确实有效——至少,这就是我们现在在D运行时中所做的,到目前为止,还没有关于问题的报告:


令人惊讶的是,你已经走了这么远。您知道FS技巧只适用于x86吗?您的工作是出于好奇,还是真的要自己制作光纤实现?据我所知,CLR设计人员在达到堆栈限制时也尝试替换堆栈,但失败()。您可能会欺骗操作系统为一个物理线程使用多个堆栈,但未来的安全更新很可能会增加额外的障碍。这是另一个受害者:代码显然仅限于x86,是的。D语言运行时已经有了自己的光纤实现,我希望避免切换到
CreateFiber
和friends,因为目前Windows和Posix代码路径非常并行——不过我可能没有其他选择。不管怎样,我目前正在尝试手动复制必要的处理程序,让我们看看它是否有效…(我知道,将来的更新可能会中断)在指向ntdll的链顶部生成一个»假«(因为未使用)
EXCEPTION\u注册
结构!FinalExceptionHandler似乎做到了这一点——将看看它在实践中是否奏效。