3.用户异常的分发
異常如果發生在內核層,處理起來比較簡單,因為異常處理函數也在0環,不用切換堆棧,但是如果異常發生在3環,就意味著必須要切換堆棧,回到3環執行處理函數。
切換堆棧的處理方式與用戶APC的執行過程幾乎是一樣的,唯一的區別就是執行用戶APC時返回3環后執行的函數是KiUserApcDispatcher,而異常處理時返回3環后執行的函數是KiUserExceptionDispatcher.
所以,理解用戶APC的執行過程是理解3環異常處理的關鍵。
VOID KiDispatchException (ExceptionRecord,ExceptionFrame, TrapFrame, PreviousMode,FirstChance )用戶異常跳轉
這些都是修改Ktrap_Frame回準備回3環操作
修改Ktrap_Frame.eip
無論通過那種方式,但線程再次回到3環時,將執行KiUserExceptionDispatcher函數
KiUserExceptionDispatcher()函數會將異常發生給一個基于幀的異常處理器,如果存在異常處理器處理了該異常,則程序繼續執行。
如果該異常仍未被處理,調用NtRaiseException函數再次進入內核中處理該異常,這次KiDispatchException函數的FirstChance為FALSE(不是第一次了),第二次還沒處理該異常,則終止該進程
總結
- 上一篇: 2.内核异常处理流程
- 下一篇: 5.SEH(结构化异常处理)