内核学习——异常处理之 CPU/模拟异常的记录及初步分发

异常的处理流程

异常记录,异常分发,异常处理

异常的分类

1)CPU检测到的异常(例:除零)
2)软件模拟产生的异常(例:try catch)

1)发生在内核空间的内核异常
2)发生在用户空间的用户异常

一、CPU检测到的异常的记录和分发(可用ida打开ntoskrnl.exe分析)
  • CPU检测到异常(例:除零)
  • 查IDT表,执行中断处理函数
  • CommonDispatchException把异常相关的信息写入EXCEPTION_RECORD结构体,并未处理异常,可理解为异常的记录
  • KiDispatchException分发异常,寻找异常的处理函数,可理解为异常的初步分发

type struct _EXCEPTION_RECORD{
DWORD ExceptionCode //异常代码,就像一个ID
DWORD ExceptionFlags//异常状态,可用来区分是CPU异常还是软件模拟异常
struct _EXCEPTION_RECORD* ExceptionRecord//下一个异常,嵌套异常时会使用
PVOID ExceptionAddress//异常发生地址
DWORD NumberParameters//附加参数个数,一般不关注
ULONG_PTR ExceptionInformation [EXCEPTION_MAXIMUM_PARAMETERS]//附加参数指针,一般不关注
}

二、软件模拟产生的异常的记录和分发
  • throw了异常
  • CxxThrowException(vc6里的,不同语言该函数可能不同)
  • KERNEL32.DLL的RaiseException,作用同CommonDispatchException
  • NTDLL.DLL!RtlRaiseException
  • NT!NtRaiseException
  • NT!KiRaiseException
  • KiDispatchException同上

一些值得注意的点

  1. 两种异常的共同点为最后都调用了KiDispachException
CPU产生的异常软件模拟的异常
异常的记录RaiseExceptionCommonDispatchException
异常的初步分发KiDispatchExceptionKiDispatchException
  1. 两种异常在填充EXCEPTION_RECORD结构体时的不同点
CPU产生的异常软件模拟的异常
ExceptionCode固定不固定
ExceptionAddress存了真实的地址存了RaiseException函数的地址
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

q1uTruth

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

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

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

打赏作者

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

抵扣说明:

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

余额充值