Windows异常分发函数---KiUserExceptionDispatcher
1.操作系统异常处理
KiUserExceptionDispatcher 是SEH分发器的用户模式的负责函数。
当一个异常发生的时候,该异常将生成一个异常事件,内核检查该异常是否是由于执行用户模式代码导致的。
如果是这样的话,内核修改栈上的trap frame,因此当内核从中断或者异常返回的时候,线程将从KiUserExceptionDispatcher 函数执行而不是导致异常的指令。
内核将另外安排几个参数(一个 PCONTEXT 和一个 PEXCEPTION_RECORD),它们描述了异常发生时机器的状态,而且在线程返回到用户模式之前被传递给KiUserExceptionDispatcher 函数。
一旦内核模式栈展开,而且指令转移到用户模式的KiUserExceptionDispatcher 函数,该函数通过调用一个本地的函数RtlDispatchException来处理异常,RtlDispatchException是用户模式异常处理逻辑中的核心函数。
如果异常被成功分发的话(也就是SHE 链表中有一个函数宣称可以处理该异常), RtlDispatchException调用RtlRestoreContext 函数实现最终的用户模式上下文的设置,该函数只是加载给定的上下文中的寄存器到到处理器的体系结构执行状态中。
否则,通过调用 NtRaiseException 函数,异常重新被提交到内核模式,这是最后一次机会了。在内核停止该进程之前,这给了用户模式调试器(如果有的话)一个处理该异常的最后机会。
(内核内部在安排KiUserExceptionDispatcher执行之前给了用户模式调试器和内核模式调试器第一次处理该异常的机会)
// 异常的传递过程: VEH -> SEH -> UEH -> VCH
2. 调试器断点功能
2.1 硬件断点
Dr0 ~ Dr7
2.2 软件断点
int 3
2.3 单步断点
tf 标记位
2.4 内存断点
内存属性
3. 调试器的实现原理
PS: 途中相关的流程中存在于博客园文件中,可以随时下载修改。
参考文献:
1.Windows异常分发函数---KiUserExceptionDispatcher
2.当出现ntdll!KiUserExceptionDispatcher时,如何用windbg 定位正确堆栈
3. VEH(向量化异常处理)