Windows下的异常处理_1

Windows下的异常处理学习笔记

Posted by breakingdevil on January 3, 2019

Windows下的异常处理

《加密与解密4》读书笔记,关于Windows下的异常处理。这本书超级好,安利,安利,大家去购买吧。

  • 中断由外部硬件设备或者异步事件产生
  • 异常由内部事件产生
异常的分类
  1. 故障
  2. 陷阱
  3. 终止

故障和陷阱是可以恢复的,而终止是不可以恢复的。

异常处理的基本过程

​ 当有中断或者异常发生时,操作系统将从IDT(interrupt descriptor table)寻找相应的处理函数。

​ IDT的位置和长度由IDTR来记录,高32位为基址,低16位为表长。

​ 其中IDT中的每一项都是一个”门”结构。

  • 任务门。用于CPU任务的切换。
  • 中断门。用于记录中断程序入口。
  • 陷阱门。用于记录异常处理函数入口。

各个异常处理函数在处理异常时会对异常信息进行封装。分为两部分,一部分为异常记录,包含本次的异常信息,由一个结构体记录。另一部分为陷阱帧,它将精确的记录发生异常时线程的状态。_KT_TRAP_FRAM这个结构一般供系统内核使用,当系统把异常交给用户注册的异常处理函数时,它会转化为CONTEXT,通俗来讲就是上下文,就是描述CPU当时的状态。封装完成后由内核的分发异常函数将异常发给特定目标,例如调试器,等等。

内核态的异常处理

​ 发生内核态异常时,一般而言就是写的代码发生了BUG,这种BUG很严重,如果得不到处理会引起“蓝屏”。内核态的异常分发时为以下步骤。

  1. 检测当前是否有内核调试器调试。
  2. 线程注册的结构化异常处理(Structure Exception Handling)来寻找处理函数。
  3. 给内核调试器第二次调试机会
  4. 蓝屏!!!

可以看出,只要异常被处理了,就不会蓝屏。

用户态的异常处理

​ 一般而言用户态的异常不会引发严重错误,操作系统按照一定流程分发异常,如果没有函数处理,则直接ExitProcess。