Win32结构化异常处理(SEH)探秘(上)
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-29
rames.CPp //========================================================= // ShowSEHFrames - Matt Pietrek 1997 // Microsoft Systems Journal, February 1997 // FILE: ShowSEHFrames.CPp // 使用命令行CL ShowSehFrames.CPP进行编译 //========================================================= #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> #pragma hdrstop //------------------------------------------------------------------- // 本程序仅适用于Visual C++,它使用的数据结构是特定于Visual C++的 //------------------------------------------------------------------- #ifndef _MSC_VEr #error Visual C++ Required (Visual C++ specific information is displayed) #endif //------------------------------------------------------------------- // 结构定义 //------------------------------------------------------------------- // 操作系统定义的基本异常帧 struct EXCEPTION_REGISTRATION { EXCEPTION_REGISTRATION* prev; FARPROC handler; }; // Visual C++扩展异常帧指向的数据结构 struct scopetable_entry { DWORD previousTryLevel; FARPROC lpfnFilter; FARPROC lpfnHandler; }; // Visual C++使用的扩展异常帧 struct VC_EXCEPTION_REGISTRATION : EXCEPTION_REGISTRATION { scopetable_entry * scopetable; int trylevel; int _ebp; }; //---------------------------------------------------------------- // 原型声明 //---------------------------------------------------------------- // __except_handler3是Visual C++运行时库函数,我们想打印出它的地址 // 但是它的原型并没有出现在任何头文件中,所以我们需要自己声明它。 extern "C" int _except_handler3(PEXCEPTION_RECORD, EXCEPTION_REGISTRATION *, PCONTEXT, PEXCEPTION_RECORD); //------------------------------------------------------------- // 代码 //------------------------------------------------------------- // // 显示一个异常帧及其相应的scopetable的信息 // void ShowSEHFrame( VC_EXCEPTION_REGISTRATION * pVCExcRec ) { printf( "Frame: %08X Handler: %08X Prev: %08X Scopetable: %08X\n", pVCExcRec, pVCExcRec->handler, pVCExcRec->prev, pVCExcRec->scopetable ); scopetable_entry * pScopeTableEntry = pVCExcRec->scopetable; for ( unsigned i = 0; i <= pVCExcRec->trylevel; i++ ) { printf( " scopetable[%u] PrevTryLevel: %08X " "filter: %08X __except: %08X\n", i, pScopeTableEntry->previousTryLevel, pScopeTableEntry->lpfnFilter, pScopeTableEntry->lpfnHandler ); pScopeTableEntry++; } printf( "\n" ); } // // 遍历异常帧的链表,按顺序显示它们的信息 // void WalkSEHFrames( void ) { VC_EXCEPTION_REGISTRATION * pVCExcRec; // 打印出__except_handler3函数的位置 printf( "_except_handler3 is at address: %08X\n", _except_handler3 ); printf( "\n" ); // 从FS:[0]处获取指向链表头的指针 __asm mov eax, FS:[0] __asm mov [pVCExcRec], EAX // 遍历异常帧的链表。0xFFFFFFFF标志着链表的结尾 while ( 0xFFFFFFFF != (unsigned)pVCExcRec ) { ShowSEHFrame( pVCEx |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Win32结构化异常处理(SEH)探秘(上)的所有评论