2012-02-12 55 views
4

我正在天然纖維/協程執行 - 相當標準,對於每個纖維,單獨的堆棧分配,並切換上下文,寄存器被壓入源上下文堆棧並從目標堆棧彈出。它運作良好,但現在我碰到了一個小問題:SEH設置用於與異常鏈驗證纖維(SEHOP)活性

我需要SEH在光纖內工作(如果程序終止或者異常事件發生時就會發生奇怪的事情,直到光纖的最後一個棧幀,慣於)。只是保存/上下文切換期間恢復FS:[0](與FS:[4]FS:[8]沿,很明顯)和初始設定FS:[0]爲新分配的纖維0xFFFFFFFF(使得上下文切換之後設置異常處理程序將在鏈的根)差不多的作品。

準確地說,它適用於我測試過的所有非服務器Windows操作系統 - 問題在於Windows Server 2008和2008 R2具有默認啓用的異常鏈驗證(SEHOP,SEH覆蓋保護)功能,這使得RaiseException檢查原始處理程序(ntdll.dll中的某個地方)是否仍然是該鏈的根目錄,並立即終止該程序,如同沒有安裝其他處理程序一樣。

因此,我面對堆棧上構建一個適當的根框架保持驗證代碼快樂的問題。是否有任何(隱藏的)API函數可以調用,或者我必須弄清楚需要保留RtlDispatchException和朋友是否滿意,並自己構建適當的_EXCEPTION_REGISTRATION條目?我不能重用創建線程在Windows提供的一個,因爲它是在錯誤的地址(SEH的實現還檢查處理程序地址是由FS:[4]FS:[8]給出的邊界,也可能,如果該地址順序是一致的)。

噢,我非常喜歡而不是訴諸於CreateFiber WinAPI功能家族。

+0

令人驚訝的是你有多遠。你知道FS技巧只適用於x86?你的工作是出於好奇還是你認真做出自己的光纖實施?據我所知,當CLR設計人員確實達到了堆棧限制但是失敗時,他們也試圖替換堆棧(http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524。 ASPX)。您可能會欺騙操作系統爲一個物理線程使用多個堆棧,但未來的安全更新很可能會增加額外的障礙。 – 2012-02-12 15:29:53

+0

下面是另一個受害者:http://stackoverflow.com/questions/2357102/mixing-win32-seh-with-heap-allocated-stack-frames – 2012-02-12 15:38:37

+0

代碼顯然是唯一的X86,是的。 D語言運行時已經有了自己的光纖實現,我想避免切換到'CreateFiber'和朋友,因爲目前Windows和Posix代碼路徑很好地平行 - 也許我沒有別的選擇。無論如何,我現在嘗試手工複製所需的處理程序,讓我們看看它的作品了......(在與未來的更新打破,我知道) – klickverbot 2012-02-12 16:17:20

回答