windows下异常处理
2011-12-26 22:17
134 查看
异常的分发和处理时在线程范围内进行的,异常处理器的注册也是相对线程而言的。Windows系统中的每个用户态线程都拥有一个线程环境块(Thread Environment Block),TEB结构的具体定义。TEB结构的起始处总有一个被称为线程信息块(Thread information Block)的结构,简称TIB。TIB的第一字段ExceptionList记录的就是用来登记结构化异常处理链表的表头地址,在x86系统中,段寄存器FS总是指向线程的TEB/TIB结构,FS:[0] 总是指向结构化异常处理链表的表头,所以将这个链表称为FS:[0]链条。可以把结构化异常处理看作是操作系统与用户代码软硬件异常的一种模型,而FS:[0]链条便是这两者间协作的接口。当有异常需要处理时,操作系统通过FS:[0]链条来寻找异常处理器,给用户代码异常情况的机会。
可以手工编写代码来登记和注销异常处理器。首先需要编写一个异常处理器函数,它应该具有标准的sehHandler原型,然后在栈上建立一个EXCEPTION_REGISTRATION_RECORD结构,并把这个结构的地址注册到FS:[0]链表中。
注册FS:[0]的代码如下所示:
可以手工编写代码来登记和注销异常处理器。首先需要编写一个异常处理器函数,它应该具有标准的sehHandler原型,然后在栈上建立一个EXCEPTION_REGISTRATION_RECORD结构,并把这个结构的地址注册到FS:[0]链表中。
注册FS:[0]的代码如下所示:
#include "stdafx.h" #include <windows.h> // 定义一个符合sehHandler原型的异常处理函数,如果该函数检测发生的是 // 除零异常,然后将上下文结构中的ECX寄存器的值改为10,让其继续执行 // 导致异常的代码,第二次执行时由于除数不再为0所以可以顺利执行了 EXCEPTION_DISPOSITION __cdecl _raw_seh_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT * ContexRecord, void * DispacherContext ) { printf("_raw_seh_handler: code-0x%x, flags-0x%x\n", ExceptionRecord->ExceptionCode, ExceptionRecord->ExceptionFlags); if(ExceptionRecord->ExceptionCode == STATUS_INTEGER_DIVIDE_BY_ZERO) { ContexRecord->Ecx = 10; return ExceptionContinueExecution; } return ExceptionContinueSearch; } int main(int argc, char* argv[]) { __asm { // 手工方法将异常函数注册到FS:[0]链表中 push OFFSET _raw_seh_handler push FS:[0] mov FS:[0], ESP // 执行除零异常 xor edx, edx mov eax, 100 xor ecx, ecx idiv ecx mov eax, [ESP] mov FS:[0], EAX add esp, 8 } printf("Hello World!\n"); return 0; } |
相关文章推荐
- 关于windows的safari浏览器的parseInt()函数处理08和09异常问题
- Windows异常处理流程
- Windows 系统异常处理顺序总结
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到
- C++在windows下的异常处理
- oracle 异常关闭造成 -重启服务仍无法正常连接 -windows处理
- 细说windows的异常处理和实现——结构化异常
- 关于windows的safari浏览器的parseInt()函数处理08和09异常问题
- Windows异常处理流程
- Windows 系统编程初探 (四)结构化异常处理之一:SEH的基本原理与进程相关异常处理
- windows 多线程捕获未处理的异常,防止崩溃的地方影响到其它线程
- 关于windows的safari浏览器的parseInt()函数处理08和09异常问题
- windows异常处理 __try __except
- windows异常处理 __try __except
- 利用Windows异常处理和RDTSC指令反调试学习
- 关于windows的safari浏览器的parseInt()函数处理08和09异常问题
- 处理[未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Form.dll]异常
- 书羊农历控件使用步骤及处理错误:引发了“System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常
- windows文本在linux上处理异常问题
- Windows异常处理流程