1:基础
1:当一个线程出错时,操作系统会回调一个用户定义的回调函数
//操作系统回调的函数_except_handler
EXCEPTION_DISPOSITION __cdecl _except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord, //上下文寄存器信息
void * DispatcherContext);
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode; //异常编码
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress; //异常出错地址
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
用户在回调函数中看到上下文信息,异常编码,出错地址,便能做相应的处理
2:此回调函数指针被放在一个EXCEPTION_REGISTRATION结构中,而这个结构指针被放在TEB前4个字节中(SEH是基于线程的),在Win32平台上,FS寄存器总指向当前TEB,所以,FS:[0]就是这个EXCEPTION_REGISTRATION结构的指针
http://blog.csdn.net/masefee/article/details/4817730
http://blog.csdn.net/ykdsg/article/details/6308083
http://gmd20.blog.163.com/blog/static/16843923201211352411279/