background image

注册时,只需要创建这样一个结构,然后把它的地址放到 FS 段偏移 0 的位置上去就行了。

下面这句汇编代码演示了这一操作:mov FS:[0], exc_regp

prev 字段用于建立一个 EXCEPTION_REGISTRATION 结构的链表,每次注册新的

EXCEPTION_REGISTRATION 时,我们都要把原来注册的那个的地址存到 prev 中。那么,

那个异常回调函数长什么样呢?在 excpt.h 中,windows 定义了它的原形:

EXCEPTION_DISPOSITION (*handler)( 

    _EXCEPTION_RECORD *ExcRecord, 

    void* EstablisherFrame, 

    _CONTEXT *ContextRecord, 

    void* DispatcherContext); 

不要管它的参数和返回值,我们先来看一个简单的例子。下面的程序注册了一个异常处理

程序,然后通过除以零产生了一个异常。异常处理程序捕获了它,打印了一条消息就完事

大吉并退出了。

#include  

#include  

using std::cout; 

using std::endl; 

struct EXCEPTION_REGISTRATION 

    EXCEPTION_REGISTRATION* prev; 

    DWORD handler; 

}; 

EXCEPTION_DISPOSITION myHandler( 

    _EXCEPTION_RECORD *ExcRecord, 

    void * EstablisherFrame, 

    _CONTEXT *ContextRecord,