- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究原生纤程/协程实现——相当标准,为每个纤程分配一个单独的堆栈,为了切换上下文,寄存器被推送到源上下文堆栈上并从目标堆栈中弹出。它运作良好,但现在我遇到了一个小问题:
我需要 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/
计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它👇 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 。 👇博主的上篇连载文章《初识图像处理技术》 。 图像处理
我正在尝试通过引用 document 在我的笔记本电脑上安装 Sunbird . 但是在 npm install 上出错步 gyp WARN install got an error, rolling
我使用 npx create-nuxt-app 创建了一个 Nuxt 应用程序 但是当运行开发服务器时 npm run dev出现以下错误 ╭────────────────────────────
我是一名优秀的程序员,十分优秀!