异常分发(内核异常)

本文详细介绍了Windows系统中用户层异常与内核层异常的处理流程,重点解析了`KiDispatchException`函数的角色。该函数负责备份Trap_frame,判断异常模式,并根据内核调试器的存在与否调用异常处理链表。若异常未被处理,则可能触发系统蓝屏。异常处理涉及关键数据结构如EXCEPTION_REGISTRATION_RECORD,用于遍历并调用异常处理函数。
摘要由CSDN通过智能技术生成

用户层异常与内核层异常

异常,可以发生在用户空间,也可以发生在内核空间

无论是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)

  1. _KeContextFromKframes 将Trap_frame备份到context为返回3环做准备
  2. 判断先前模式 0是内核调用,1是用户调用
  3. 是否是第一次机会
  4. 是否有内核调试器
  5. 如果没有或者内核调试器不处理
  6. 调用RtlDispatchException
  7. 如果返回FALSE,也就是0
  8. 再次判断是否有内核调试器,有调用,没有直接蓝屏

RtlDispatchException函数的执行流程

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

RtlDispatchException的作用就是:

遍历异常链表,调用异常处理函数,如果异常被正确处理了,该函数返回1.如果当前异常处理函数不能处理该异常,那么调用下一个,以此类推。如果到最后也没有人处理这个异常,则返回0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值