异常记录(CPU产生的异常和软件模拟产生的异常)
文章目录
- 前奏
- 异常的分类
- 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异常执行的流程:
- CPU指令检测到异常
- 查IDT表,执行中断处理函数(往往并不真正处理异常,而是调用函数)
- 调用CommonDispatchException(构造_EXCEPTION_RECORD)
- 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函数分析
- EXCEPTION_RECORD.ExceptionCode最高位清零,用于区分CPU异常
- 调用
KiDispatchException
开始分发异常
总结:
CPU异常:
CPU指令检测到异常------>查IDT
表,执行中断处理函数--------->CommonDispatchException
(填充ExceptionRecord
结构体)------>KiDispatchException
模拟异常:throw关键词(依赖编译器)---->CxxThrowException
------->(KERNEL32.DLL)RaiseException
(DWORD dwException,DWORD dwExceptionFlags,DWORD nNumberOfArguments,const of ULONG_PTR *IPArguments
)(作用:填充ExceptionRecord结构体)--------->NTDLL.DLL!RtIRaiseException()
------->NT!NtRaiseException(ExceptionCode
最高位清零)---->NT!KiRaiseException
CPU异常和模拟异常类型不同,仅仅异常记录时不同,但是等到异常分发时,就没法区分了
异常记录(CPU产生的异常和软件模拟产生的异常)相关推荐
- Windows异常学习笔记(一)—— CPU异常记录模拟异常记录
Windows异常学习笔记(一)-- CPU异常记录 基础知识 异常的分类 CPU异常 分析中断处理函数 _KiTrap00 分析 CommonDispatchException 总结 软件模拟异常 ...
- CPU和软件模拟异常的执行流程
文章目录 CPU异常记录 异常的分类 CPU产生的异常 软件模拟产生的异常 CPU异常的处理流程 CommonDispatchException函数分析 总结 模拟异常记录 模拟异常的执行流程 Rai ...
- 如何查询当前手机的cpu架构,so库导入工程又出异常了?
如何查询当前手机的cpu架构,so库导入工程又出异常了? 参考文章: (1)如何查询当前手机的cpu架构,so库导入工程又出异常了? (2)https://www.cnblogs.com/woaixi ...
- 异常记录-No module named ‘numpy.core._multiarray_umath
异常记录-No module named 'numpy.core._multiarray_umath 参考文章: (1)异常记录-No module named 'numpy.core._multia ...
- 异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError
异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 参考文章: (1)异常记录: Handle ...
- Maven : maven异常记录-must be unique maven duplicate declaration of version
1.美图 2.背景 maven异常记录 INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountere ...
- 运用Unity实现AOP拦截器[结合异常记录实例]
运用Unity实现AOP拦截器[结合异常记录实例] 参考文章: (1)运用Unity实现AOP拦截器[结合异常记录实例] (2)https://www.cnblogs.com/wujy/p/33233 ...
- spring.net结合普通三层(实现IOC 及AOP中的异常记录功能)
spring.net结合普通三层(实现IOC 及AOP中的异常记录功能) 参考文章: (1)spring.net结合普通三层(实现IOC 及AOP中的异常记录功能) (2)https://www.cn ...
- 异常记录——使用Mybatis报BindingException
异常记录--使用Mybatis报BindingException 参考文章: (1)异常记录--使用Mybatis报BindingException (2)https://www.cnblogs.co ...
最新文章
- 【转载】如果你身边有程序员的朋友,请善待他们
- 台湾国立大学郭彦甫Matlab教程笔记(16) 数值微分 numerical differentiation
- Toast的功能和用法
- 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
- 1.18.2.10 解释表:Table.explain、物理执行计划等
- python列表的append/entend/insert
- Spring注入总结
- How is HashMap return type handled to be converted to a json string
- 前端处理后台返回的流数据
- 汉字,五笔,拼音的转换
- 软件工程师与码农的区别
- Flutter实战之底部导航栏 BottomNavigation
- 入门命令5-流程跳转:goto
- chrome浏览器debug vue项目,跳过vue源码
- 安卓分屏神器_平板机皇!华为MatePad Pro全面评测:这才是安卓生产力标杆
- JavaScript问题:一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米
- 基于在线学习行为的评价模型的设计与实现
- 石墨文档链接不到服务器,石墨文档怎么打开链接
- Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...
- 声网Agora Signaling SD例子运行方法