gpt4 book ai didi

winapi - 启用异常链验证 (SEHOP) 的光纤的 SEH 设置

转载 作者:行者123 更新时间:2023-12-01 05:34:57 25 4
gpt4 key购买 nike

我正在研究原生纤程/协程实现——相当标准,为每个纤程分配一个单独的堆栈,为了切换上下文,寄存器被推送到源上下文堆栈上并从目标堆栈中弹出。它运作良好,但现在我遇到了一个小问题:

我需要 SEH 在光纤中工作(如果程序终止或在光纤的最后一个堆栈帧之前未处理异常时开始发生奇怪的事情,它不会)。只是保存/恢复 FS:[0] (显然,还有 FS:[4]FS:[8] )在上下文切换期间,并且最初将新分配的光纤的 FS:[0] 设置为 0xFFFFFFFF (以便在上下文切换后设置的异常处理程序将成为链的根)几乎可以工作。

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

因此,我面临着在堆栈上构建适当的根框架以保持验证代码满意的问题。是否有任何(隐藏的?)API 函数我可以调用来做到这一点,或者我必须弄清楚需要什么来保持 RtlDispatchException和 friend 一起开心,构建合适的_EXCEPTION_REGISTRATION自己入境?我不能仅仅从创建线程中重用 Windows 提供的一个,因为它位于错误的地址(SEH 实现还检查处理程序地址是否在 FS:[4]FS:[8] 给定的边界内,也可能如果地址顺序一致)。

哦,我非常不想求助于 CreateFiber WinAPI 函数系列。

最佳答案

我在评论中提到的方法,生成了一个假 EXCEPTION_REGISTRATION条目指向 ntdll!FinalExceptionHandler似乎在实践中确实有效——至少,这就是我们现在在 D 运行时中所拥有的,到目前为止还没有问题的报告:

https://github.com/D-Programming-Language/druntime/blob/c39de42dd11311844c0ef90953aa65f333ea55ab/src/core/thread.d#L4027

关于winapi - 启用异常链验证 (SEHOP) 的光纤的 SEH 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com