注册时,只需要创建这样一个结构,然后把它的地址放到 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,