1. 程式人生 > >Win32結構化異常處理(SEH)——異常處理程式(__try/__except)

Win32結構化異常處理(SEH)——異常處理程式(__try/__except)


20:       {
21:           a = 2;
0040D8C3   mov         dword ptr [ebp-1Ch],2
22:       }
0040D8CA   mov         dword ptr [ebp-4],0FFFFFFFFh
23:       a = 3;
0040D8D1   mov         dword ptr [ebp-1Ch],3
24:       return 0;
0040D8D8   xor         eax,eax
25:   }
0040D8DA   mov         ecx,dword ptr [ebp-10h]
0040D8DD   mov         dword ptr fs:[0],ecx
0040D8E4   pop         edi
0040D8E5   pop         esi
0040D8E6   pop         ebx
0040D8E7   add         esp,5Ch
0040D8EA   cmp         ebp,esp
0040D8EC   call        __chkesp (004010c0)
0040D8F1   mov         esp,ebp
0040D8F3   pop         ebp
0040D8F4   ret
        現在,我們來總結一下,在VC++6.0中,如果我們在一個函式中使用了SEH,編譯器會為我們產生一個EXCEPTION_REGISTRATION結 構,設定相應的值,並把這個結構串在fs:[0]指向的SEH鏈上,如果這個函式中有多個try塊,不管是巢狀的還是平行的,編譯器都會分別把這些塊的信 息放在一個叫SCOPETABLE的結構中,並形成一個數組,並把這個陣列的首地址賦給EXCEPTION_REGISTRATION結構的成員 scopetable,如果有多個函式,那麼編譯器會為我們產生多個EXCEPTION_REGISTRATION結構,並且都串在SEH鏈上。當一個用 到SEH鏈的函式產生異常時,系統會呼叫編譯器設定在EXCEPTION_REGISTRATION裡的異常處理函式 __except_handler3,再由這個函式在產生異常的那個函式對應的EXCEPTION_REGISTRATION結構中搜索,看哪個 except塊可以解決這個異常(如果過濾函式返回不是EXCEPTION_CONTINUE_SEARCH,就表示可以解決),如果沒有可以解決的,則 會轉到一個叫UnhandledExceptionFilter函式那裡,在這裡,一般會結束掉產生異常的執行緒或程序,如果可以解決的話,而且過濾函式的 返回值又是EXCEPTION_EXECUTE_HANDLERR的話,__except_handler3會把控制權交給我們的except塊的程式碼並 恢復棧指標ESP,程式繼續向下執行。