文章目录

  • 前奏
  • 异常的分类
    • CPU产生的异常
    • 软件模拟产生的异常
  • 异常产生
    • CPU异常的产生
  • CommonDispatchException函数分析
    • 总结:
    • 软件模拟异常
    • 填充ExceptionRecord结构体
    • KiRaiseException函数分析
    • 总结:

前奏

当API函数3环进0环时,第一件事就是保存现场,保存到_Trap_Frame

异常的分类

CPU产生的异常


错误首先肯定被CPU先发现,然后CPU就会执行相应的错误处理程序

软件模拟产生的异常

throw 1

异常产生

CPU异常的产生

CPU指令检测到异常(例:除0)------>查IDT表,执行中断处理函数--------->CommonDispatchException------>KiDispatchException

在跳转CommonDispatchException之前,还传了两个参数

ebp+68h也就是上图Trap结构体的Eip

0x0c0000094h也就是ExceptionCode

传了两个参数后调用CommonDispatchException,

CommonDispatchException函数分析

该函数构造一个_EXCEPTION_RECORD结构体,并赋值

CommonDispatchException函数的作用也就是把一些值赋值给一个_EXCEPTION_RECORD结构体

type struct _EXCEPTION_RECORD
{DWORD ExceptionCode;//异常代码(异常类型)
DWORD   ExceptionFlags;//异常状态
Struct _EXCEPTION_RECORD* ExceptionRecord;//下一个异常
PVOID   ExceptionAddress;        //附加发生地址(异常发生地址)
DWORD NumberParameters;      //附加参数个数
ULONG_PTR   ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS];//附加参数指针
}

结构体作用就是用来记录异常信息

ExceptionFlags(给后面的处理程序所用,辨别异常状态)

Struct _EXCEPTION_RECORD* ExceptionRecord(通常为空,当发生嵌套异常(当异常处理程序里面又发生异常时)这个指针会指向下一个异常)

总结:

CPU异常执行的流程:

  1. CPU指令检测到异常
  2. 查IDT表,执行中断处理函数(往往并不真正处理异常,而是调用函数)
  3. 调用CommonDispatchException(构造_EXCEPTION_RECORD)
  4. KiDispatchException(分发异常:目的是找到异常处理函数)

软件模拟异常



模拟异常的产生:
CxxThrowException------->(KERNEL32.DLL)RaiseException(DWORD dwException,DWORD dwExceptionFlags,DWORD nNumberOfArguments,const of ULONG_PTR *IPArguments)--------->NTDLL.DLL!RtIRaiseException()------->NT!NtRaiseException---->NT!KiRaiseException

填充ExceptionRecord结构体

type struct _EXCEPTION_RECORD
{
DWORD ExceptionCode;//异常代码(异常类型)
DWORD ExceptionFlags;//异常状态
Struct _EXCEPTION_RECORD* ExceptionRecord;//下一个异常PVOID ExceptionAddress; //附加发生地址(异常发生地址)DWORD NumberParameters; //附加参数个数ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];//附加参数指针}


软件模拟异常这个ExceptionCode是固定的,值取决于编译环境,编译环境不同,ExceptionCode也不同

这个ExceptionAddress并不是抛出异常的位置,而是存了一个固定的值,这个值就是函数RaiseException地址

(以上两点就是CPU产生的异常和软件模拟产生的异常之间的区别)

KiRaiseException函数分析

  1. EXCEPTION_RECORD.ExceptionCode最高位清零,用于区分CPU异常
  2. 调用KiDispatchException 开始分发异常

总结:

CPU异常:
CPU指令检测到异常------>查IDT表,执行中断处理函数--------->CommonDispatchException(填充ExceptionRecord结构体)------>KiDispatchException

模拟异常:throw关键词(依赖编译器)---->CxxThrowException------->(KERNEL32.DLL)RaiseExceptionDWORD dwException,DWORD dwExceptionFlags,DWORD nNumberOfArguments,const of ULONG_PTR *IPArguments)(作用:填充ExceptionRecord结构体)--------->NTDLL.DLL!RtIRaiseException()------->NT!NtRaiseException(ExceptionCode最高位清零)---->NT!KiRaiseException

CPU异常和模拟异常类型不同,仅仅异常记录时不同,但是等到异常分发时,就没法区分了

异常记录(CPU产生的异常和软件模拟产生的异常)相关推荐

  1. Windows异常学习笔记(一)—— CPU异常记录模拟异常记录

    Windows异常学习笔记(一)-- CPU异常记录 基础知识 异常的分类 CPU异常 分析中断处理函数 _KiTrap00 分析 CommonDispatchException 总结 软件模拟异常 ...

  2. CPU和软件模拟异常的执行流程

    文章目录 CPU异常记录 异常的分类 CPU产生的异常 软件模拟产生的异常 CPU异常的处理流程 CommonDispatchException函数分析 总结 模拟异常记录 模拟异常的执行流程 Rai ...

  3. 如何查询当前手机的cpu架构,so库导入工程又出异常了?

    如何查询当前手机的cpu架构,so库导入工程又出异常了? 参考文章: (1)如何查询当前手机的cpu架构,so库导入工程又出异常了? (2)https://www.cnblogs.com/woaixi ...

  4. 异常记录-No module named ‘numpy.core._multiarray_umath

    异常记录-No module named 'numpy.core._multiarray_umath 参考文章: (1)异常记录-No module named 'numpy.core._multia ...

  5. 异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError

    异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 参考文章: (1)异常记录: Handle ...

  6. Maven : maven异常记录-must be unique maven duplicate declaration of version

    1.美图 2.背景 maven异常记录 INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountere ...

  7. 运用Unity实现AOP拦截器[结合异常记录实例]

    运用Unity实现AOP拦截器[结合异常记录实例] 参考文章: (1)运用Unity实现AOP拦截器[结合异常记录实例] (2)https://www.cnblogs.com/wujy/p/33233 ...

  8. spring.net结合普通三层(实现IOC 及AOP中的异常记录功能)

    spring.net结合普通三层(实现IOC 及AOP中的异常记录功能) 参考文章: (1)spring.net结合普通三层(实现IOC 及AOP中的异常记录功能) (2)https://www.cn ...

  9. 异常记录——使用Mybatis报BindingException

    异常记录--使用Mybatis报BindingException 参考文章: (1)异常记录--使用Mybatis报BindingException (2)https://www.cnblogs.co ...

最新文章

  1. 【转载】如果你身边有程序员的朋友,请善待他们
  2. 台湾国立大学郭彦甫Matlab教程笔记(16) 数值微分 numerical differentiation
  3. Toast的功能和用法
  4. 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
  5. 1.18.2.10 解释表:Table.explain、物理执行计划等
  6. python列表的append/entend/insert
  7. Spring注入总结
  8. How is HashMap return type handled to be converted to a json string
  9. 前端处理后台返回的流数据
  10. 汉字,五笔,拼音的转换
  11. 软件工程师与码农的区别
  12. Flutter实战之底部导航栏 BottomNavigation
  13. 入门命令5-流程跳转:goto
  14. chrome浏览器debug vue项目,跳过vue源码
  15. 安卓分屏神器_平板机皇!华为MatePad Pro全面评测:这才是安卓生产力标杆
  16. JavaScript问题:一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米
  17. 基于在线学习行为的评价模型的设计与实现
  18. 石墨文档链接不到服务器,石墨文档怎么打开链接
  19. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...
  20. 声网Agora Signaling SD例子运行方法

热门文章

  1. RL之DQN:基于TF训练DQN模型玩“打砖块”游戏
  2. Algorithm:C++语言实现之贪心法算法相关问题
  3. Python访问MySQL
  4. 拓扑排序之变量序列代码
  5. VMware虚拟机打开后不兼容
  6. MongoDB和MySQL的区别
  7. 【struts2】名为dispatcher的ResultType
  8. 在多台服务器上简单实现Redis的数据主从复制
  9. SQL 去除重复记录 只保留重复记录中的一条
  10. JAVA教程 第六讲 Java的线程和Java Applet(二)