Win32結構化異常處理(SEH)——異常處理程式(__try/__except)
阿新 • • 發佈:2019-02-20
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,程式繼續向下執行。