03 用户异常的分发

引言:
异常发生在内核层时,处理起来比较简单,因为异常处理函数也在0环,不用切换线程堆栈,但是如果发生在3环,就意味着必须切换堆栈,回到3环执行处理函数。
切换堆栈的方式与用户APC的执行过程几乎是一样的,唯一的区别就是执行APC返回3环后执行的函数是KiUserApcDispatch而异常处理返回3环执行的函数是KiUserExceptionDispatcher

1、VOID KiDispatchException (
IN PEXCEPTION_RECORD ExceptionRecord,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PKTRAP_FRAME TrapFrame,
IN KPROCESSOR_MODE PreviousMode,
IN BOOLEAN FirstChance
)
<1>_KeContextFromKframes将Trap_frames备份到context为返回3环做准备
<2>判断先前模式 , 0是内核调用,1是用户调用
<3>是否是第一次机会
<4>是否有内核调试器
<5>发送给3环调试
<6>如果3环调试器没有处理这个异常 修正EIP为KiUserExceptionDispatcher
<7>KiDispatchException函数执行结束,CPU异常与模拟异常返回地点不同
CPU异常:CPU检测到异常–>查IDT执行处理函数–>CommonDispatchException–>KiDispatchException 通过IRETD返回3环
模拟异常:CxxThrowException–>RaiseException–>RtlRaiseException–>
Nt!NtRaiseException–>NT!KiRaiseException–>KiDispatchException 通过系统调用返回3环
<8>无论哪种方式返回3环,当线程再次切换到3环时,将执行KiUserExceptionDispatcher

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/87533309
03
今日推荐