Structured Exception Handling
2007-01-14 20:14:46 来源:WEB开发网当操作系统看到所返回的ExceptionContinueExecution时,就认为问题已被解决并重新执行引起异常的指令。因为我的_except_handler函数修改了EAX寄存器使其指向了有效的内存,MOVEAX,1就再一次执行,main函数正常继续。并不很复杂,不是吗?
MovingInaLittleDeeper
有了这个最简单的情形,我们再回来填补几个空白。尽管异常回调如此伟大,但并不完美。对于任意大小的程序,编写一个函数来处理程序中可能发生的所有异常,那这个函数恐怕会是一团糟。更为可行的情形是能有多个异常处理函数,每一个函数都用于程序的某一特定的部分。操作系统提供了这个功能。
还记得系统查找异常处理回调函数所用的EXCEPTION_REGISTRATION结构体吧?此结构体的第一个参数,就是我前面忽略的那个,它叫做prev。它确实是指向另一个EXCEPTION_REGISTRATION结构体的指针。这个第二个EXCEPTION_REGISTRATION结构体可以有一个完全不同的处理函数。而且它的prev域还可以指向第三个EXCEPTION_REGISTRATION结构体,依次类推。简单讲,就是一个EXCEPTION_REGISTRATION结构体数组的链表。此链表的表头总是由线程信息块的第一个DWORD(Intel机器上的FS:[0])所指向。
操作系统用这个EXCEPTION_REGISTRATION结构体链表做什么?当异常发生时,系统遍历此链表并查找回调函数与异常相符的EXCEPTION_REGISTRATION。对于MYSEH.CPP来说,回调函数返回ExceptionContinueExecution型的值,与异常相符合。回调函数也可能不适合所发生的异常,这时系统就移向链表中下一个EXCEPTION_REGISTRATION结构体并询问异常回调是否要处理此异常。Figure4所示即为此过程。一旦系统找到了处理此异常的回调函数就停止对EXCEPTION_REGISTRATION链表的遍历。
Tags:Structured Exception Handling
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接