Windows 系統異常處理順序總結

2021-06-23 07:56:03 字數 1514 閱讀 3753

首先要明白異常處理是分層的,有:

1.核心異常處理

2.偵錯程式異常處理

3.程序veh

4.執行緒seh

5.系統預設的異常處理函式 unhandledexcetionfilter().

setunhandledexceptionfilter()來註冊新的top level exception filter函式

應用程式觸發異常時,系統在前面沒有異常處理的情況下,會呼叫kernel32.dll中的unhandledexceptionfilter()函式。

unhandledexceptionfilter()函式裡會利用ntdll.dll中的ntqueryinformationprocess()來判斷是否被除錯。

若判斷在被除錯,異常給偵錯程式處理(od偵錯程式顯示無法處理異常,程序終止)。

若判斷未被除錯,則呼叫top level exception filter函式。

預設的top level exception filter 函式根據 hklm\software\microsoft\windows nt\currentversion\aedebug子鍵中的項來處理.

異常發生時,順序執行為:

cpu捕獲異常->ring0核心異常處理->ring3層偵錯程式->ring3層的異常處理 ntdll.dll中的kiuserexceptiondispatcher().

void stdcall kiuserexceptiondispatcher (exception_record *er, context *con)
注:如int 3,eflags的trap flag,在od關閉忽略異常,strongod選項不選,將不會觸發kiuserexceptiondispatcher()函式.

kiuserexceptiondispatcher執行流程(根據某一過程的返回值,來決定下一步動作)

windows 2000:

執行緒棧中單鏈表seh(unwind)->程序setunhandledexceptionfilter()註冊的函式->系統預設的異常處理top level exception filter 函式

xp異常處理順序:

程序堆中雙鏈表veh->執行緒棧中單鏈表seh(unwind)->程序setunhandledexceptionfilter()註冊的函式->系統預設的異常處理top level exception filter 函式

結合od的個人除錯經驗,若想知道整個程序的異常情況,可以在kiuserexceptiondispatcher 下條件斷點(shift+f4):

1.異常原因: [[esp]]

log data

位址       訊息

77b46fe8   cond: 異常資訊 = 80000003

77b46fe8   斷點位於 ntdll.kiuserexceptiondispatcher

77b46fe8   cond: 異常位址 = 00411c31

77b46fe8   斷點位於 ntdll.kiuserexceptiondispatcher

mfc訊息處理順序

mfc中處理訊息的順序 1.afxwndproc 接收訊息,尋找訊息所屬的 cwnd 物件,然後呼叫 afxcallwndproc 2.afxcallwndproc 儲存訊息 訊息識別符號和訊息引數 供未來參考,然後呼叫 windowproc 3.windowproc 傳送訊息給 onwndmsg ...

網路 DNS處理順序

上文中我們知道了dns到底是個什麼樣的東西,現在我們來看下dns快取,為什麼會有dns快取呢?這是為了解決頻繁的訪問dns伺服器,直接在本地進行快取伺服器ip位址的策略,這樣我們輸入乙個 網域名稱譬如 www.baidu.com,就用再到dns伺服器去獲取對應的 的ip位址,直接從本地獲取ip位址去...

Windows系統異常處理

在c 中使用try catch不能捕捉作業系統丟擲的異常,如非法位址訪問 浮點異常等,而使用vc中的擴充套件特性 try except和 try finally可以捕捉這類異常.如 int func int i except exception execute handler return i vo...