日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异常分发(内核异常)

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异常分发(内核异常) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 用戶層異常與內核層異常
    • KiDispatchException
    • 總結:
    • `RtlDispatchException`的作用就是:

用戶層異常與內核層異常

異常,可以發生在用戶空間,也可以發生在內核空間

無論是CPU異常還是模擬異常,是用戶層異常還是內核異常,都要通過KiDispatchException函數進行分發。理解這個函數是學好異常的關鍵,這個函數比較復雜

KiDispatchException


首先第一步,不管用戶異常還是內核異常,先把Trap_frame(當前線程3環進入0環時,那些寄存區環境,也就是eip運行地方那些值)備份到context里(為返回3環做準備)

這個函數兩種異常(用戶異常和內核異常)的分發都歸它管,所以就存在異常處理是否需要回到三環,內核異常不用回去(內核異常處理函數在0環),用戶異常需要回去(用戶層處理函數在3環0)。

第二步:判斷先前模式,0是內核調用,1是用戶調用,然后緊接著判斷是否是第一次執行(執行次數是作為函數參數傳入的(這個函數不止執行一次))

第三步:第一次執行時,肯定是第一次調用,所以接著往下:

這里判斷是否啟用了內核調試器,如果有內核調試器的話,那么這個值是非零的,如果有內核調試器的話,那么接下來的執行代碼為:

沒有內核調試器和有內核調試器但是內核調試器沒處理這個異常所跳轉位置是一樣的:


跳轉位置都是如下代碼:

負責調用處理函數的代碼

進入零環后,FS指向的是KPCR


KPCR第一個成員就是ExceptionList,是一個指針,指向一個結構體,是EXCEPTION_REGISTRATION_RECORD,如下

typedef struct _EXCEPTION_REGISTRATION_RECORD { struct _EXCEPTION_REGISTRATION_RECORD *Next; PEXCEPTION_ROUTINE Handler; } EXCEPTION_REGISTRATION_RECORD;

如下圖:

處理結束后:

比較RtlDispatchException返回值,是否是1,如果不是,再次查看是否存在內核調試器,不存在內核調試器或者內核調試器未解決異常的話,那就直接跳轉

這個地址這里是藍屏代碼,如下所示:

總結:

VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)

  • _KeContextFromKframes 將Trap_frame備份到context為返回3環做準備
  • 判斷先前模式 0是內核調用,1是用戶調用
  • 是否是第一次機會
  • 是否有內核調試器
  • 如果沒有或者內核調試器不處理
  • 調用RtlDispatchException
  • 如果返回FALSE,也就是0
  • 再次判斷是否有內核調試器,有調用,沒有直接藍屏
  • RtlDispatchException函數的執行流程

    typedef struct _EXCEPTION_REGISTRATION_RECORD{ struct _EXCEPTION_REGISTRATION_RECORD *Next; PEXCEPTION_ROUTINE Handler; }EXCEPTION_REGISTRATION_RECORD;

    RtlDispatchException的作用就是:

    遍歷異常鏈表,調用異常處理函數,如果異常被正確處理了,該函數返回1.如果當前異常處理函數不能處理該異常,那么調用下一個,以此類推。如果到最后也沒有人處理這個異常,則返回0

    總結

    以上是生活随笔為你收集整理的异常分发(内核异常)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。