异常分发(内核异常)
文章目錄
- 用戶層異常與內核層異常
- KiDispatchException
- 總結:
- `RtlDispatchException`的作用就是:
用戶層異常與內核層異常
異常,可以發生在用戶空間,也可以發生在內核空間
無論是CPU異常還是模擬異常,是用戶層異常還是內核異常,都要通過KiDispatchException函數進行分發。理解這個函數是學好異常的關鍵,這個函數比較復雜
KiDispatchException
首先第一步,不管用戶異常還是內核異常,先把Trap_frame(當前線程3環進入0環時,那些寄存區環境,也就是eip運行地方那些值)備份到context里(為返回3環做準備)
這個函數兩種異常(用戶異常和內核異常)的分發都歸它管,所以就存在異常處理是否需要回到三環,內核異常不用回去(內核異常處理函數在0環),用戶異常需要回去(用戶層處理函數在3環0)。
第二步:判斷先前模式,0是內核調用,1是用戶調用,然后緊接著判斷是否是第一次執行(執行次數是作為函數參數傳入的(這個函數不止執行一次))
第三步:第一次執行時,肯定是第一次調用,所以接著往下:
這里判斷是否啟用了內核調試器,如果有內核調試器的話,那么這個值是非零的,如果有內核調試器的話,那么接下來的執行代碼為:
沒有內核調試器和有內核調試器但是內核調試器沒處理這個異常所跳轉位置是一樣的:
跳轉位置都是如下代碼:
負責調用處理函數的代碼
進入零環后,FS指向的是KPCR
KPCR第一個成員就是ExceptionList,是一個指針,指向一個結構體,是EXCEPTION_REGISTRATION_RECORD,如下
如下圖:
處理結束后:
比較RtlDispatchException返回值,是否是1,如果不是,再次查看是否存在內核調試器,不存在內核調試器或者內核調試器未解決異常的話,那就直接跳轉
這個地址這里是藍屏代碼,如下所示:
總結:
VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)
RtlDispatchException函數的執行流程
typedef struct _EXCEPTION_REGISTRATION_RECORD{ struct _EXCEPTION_REGISTRATION_RECORD *Next; PEXCEPTION_ROUTINE Handler; }EXCEPTION_REGISTRATION_RECORD;RtlDispatchException的作用就是:
遍歷異常鏈表,調用異常處理函數,如果異常被正確處理了,該函數返回1.如果當前異常處理函數不能處理該異常,那么調用下一個,以此類推。如果到最后也沒有人處理這個異常,則返回0
總結
以上是生活随笔為你收集整理的异常分发(内核异常)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常记录(CPU产生的异常和软件模拟产生
- 下一篇: 异常分发(用户异常)