SEH技術

看雪資料發表於2015-11-15

SEH技術

結構化異常處理
    當某一執行緒發生異常時,程式的控制權會立即進入Ring0異常處理程式,這是屬於作業系統的部分,
如果發生的異常是如頁異常之類的異常,Ring0處理程式可以處理完它後重新回到程式中執行,而被中斷
過的程式可能根本就不知道發生過異常。
    但事情並不總是如此,有時程式會發生一些始料不及的異常,例如訪問不存在的記憶體,被0除等,
這些異常Ring0處理程式不知該如何處理它,而程式本身也可能想自己處理這些情況,這是就要用到結構化異常處理(SEH)。在C/C++中也有異常處理的語句如_try,_catch等,這些語句的實現也與SEH緊密聯
系。
    當系統遇到一個它不知道如何處理的異常時,它就查詢異常處理連結串列,注意每個執行緒都有它自己的異
常處理連結串列。異常連結串列以FS:[0]所指向的位置為連結串列頭。
    異常處理開始時,系統把一些與當前執行緒和與異常有關的內容傳給鏈頭所指向的處理程式;處理程式
由使用者編寫或編譯器生成,它的返回值可以是告訴系統:異常處理以完成,可以繼續執行程式,或未處理
異常,可由連結串列的下一個處理程式處理等,可以一次傳遞下去。
    下面給出一個例子:
-------------------------------------------------------------------------------------------
              .386
          .model flat,stdcall
          option casemap:none
include  kernel32.inc
include  user32.inc
include  windows.inc

includelib  kernel32.lib
includelib  user32.lib

          .data
szCaption  db "SEH",0
szTextSEH  db "SEH 程式正在執行",0
szText    db "SEH 程式沒有執行",0

          .code
start:
    lea  eax,[esp-4*2]
    xchg fs:[0],eax    ;這一行編譯錯誤,哪位大蝦指點一下正確格式
    mov  ebx,offset SEH
    push ebx
    push eax

    mov  esi,0
    mov  eax,[esi]
    invoke MessageBox,0,offset szText,offset szCaption,MB_OK
    jmp  Exit
SEH:
    invoke MessageBox,0,offset szTextSEH,offset szCaption,MB_OK
Exit:
            invoke ExitProcess,0
end start
end
-------------------------------------------------------------------------------------------
後記:看雪老師託我寫個SEH相關的東東,我哪裡懂這些?臨時報佛腳從書上抄了這麼一段SEH的簡單介紹
      給大家,目的是讓大家對SEH不再感到神秘,進一步理解SEH的執行機制。

      文中的源程式是書上抄下來的,作者說在Tasm中編譯透過,可是我手頭沒有Tasm,用Masm32V6編譯
      上面的那一行老是出錯,我不知道在Masm中,段字首如何設定,還請哪位大蝦指教! (夜月)

SEH即結構異常處理,暫沒整理,只提供一些英文資料,下載