Windows内核读书笔记——SEH结构化异常处理
2016-04-11 22:36
281 查看
SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中。
SEH提供了终结处理和异常处理两种功能。
终结处理保证终结处理块中的程序一定会被执行
退出保护块的方式:正常结束和非正常结束两种
1.正常结束
正常执行并顺序进入终结处理块称为正常结束
2.非正常结束
因为发生异常或是因为return、goto、break、continue等流程控制语句而离开被保护块的称为非正常结束
在终结处理块中使用AbnormalTermination获取被保护块的退出方式。
__leave关键字在被保护块中使用,立即结束被保护块。属于正常退出。
异常处理功能用于处理异常
提供了两个宏,可在过滤表达式或异常处理块内使用
GetExceptionCode()返回异常代码
GetExceptionInformation()返回一个EXCEPTION_POINTERS结构中
过滤表达式可以是常量,函数调用也可以是条件表达式,但最后值必须是1、0、-1之一。
EXCEPTION_CONTINUE_SEARCH(0)本保护块不处理异常,系统继续搜索其他保护块
EXCEPTION_CONTINUE_EXECUTION(1)已经处理异常,程序回到异常点继续运行
EXCEPTION_EXECUTE_HANDLE(-1)让本保护块来处理这个
CONTEXT结构是用于恢复线程执行用的,其中保持了线程上下文。
在现实中,由于各种情况过滤表达式很难把异常处理到继续运行的情况。
所以VC规定C++异常的异常过滤函数禁止返回EXCEPTION_CONTINUE_EXECUTION,即禁止回到异常点继续运行。
栈展开,由于异常处理导致程序的函数执行流程出现跳跃性,所以要把栈恢复到合适执行的位置(情况),
SEH提供了终结处理和异常处理两种功能。
终结处理保证终结处理块中的程序一定会被执行
__try { //要保护的代码 } __finally { //终结处理块 }
退出保护块的方式:正常结束和非正常结束两种
1.正常结束
正常执行并顺序进入终结处理块称为正常结束
2.非正常结束
因为发生异常或是因为return、goto、break、continue等流程控制语句而离开被保护块的称为非正常结束
在终结处理块中使用AbnormalTermination获取被保护块的退出方式。
__leave关键字在被保护块中使用,立即结束被保护块。属于正常退出。
异常处理功能用于处理异常
__try { //被保护块 } __except(过滤表达式) { //异常处理块 }
提供了两个宏,可在过滤表达式或异常处理块内使用
GetExceptionCode()返回异常代码
GetExceptionInformation()返回一个EXCEPTION_POINTERS结构中
typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord;//异常记录指针 PCONTEXT ContextRecord;//线程上下文指针 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
过滤表达式可以是常量,函数调用也可以是条件表达式,但最后值必须是1、0、-1之一。
EXCEPTION_CONTINUE_SEARCH(0)本保护块不处理异常,系统继续搜索其他保护块
EXCEPTION_CONTINUE_EXECUTION(1)已经处理异常,程序回到异常点继续运行
EXCEPTION_EXECUTE_HANDLE(-1)让本保护块来处理这个
CONTEXT结构是用于恢复线程执行用的,其中保持了线程上下文。
在现实中,由于各种情况过滤表达式很难把异常处理到继续运行的情况。
所以VC规定C++异常的异常过滤函数禁止返回EXCEPTION_CONTINUE_EXECUTION,即禁止回到异常点继续运行。
栈展开,由于异常处理导致程序的函数执行流程出现跳跃性,所以要把栈恢复到合适执行的位置(情况),
相关文章推荐
- 在Ubuntu中清理Network下Connect to Server的入口
- java面试题------40个Java集合面试问题和答案
- Windows驱动开发(3) - 内核模式下的字符串操作
- 网络流的征程——Ford-Fulkerson算法
- java面试题------40个Java集合面试问题和答案
- Android Connectivity分析(1)- ConnectivityManager
- OS中常用的调度算法总结
- Secure CRT键盘自我习惯
- shiro 的role 角色权限控制简单demo论述
- identity natiive assigned
- andorid 手机外部储存
- ob_get_contents()函数及与其相关几个函数的用法
- 如何制作WIN TO GO
- Android中的Binder跨进程通信机制
- Using files from web applications
- MySQL基础三:约束和修改数据表
- C++ GC
- 【即学即用】——安装.NET Framework 4.6.1 时回滚、安装失败
- C语言如何求闰年,打印输出1000-2000年之间的所有闰年.
- C++回调函数(1)--基本概念