异常处理回调函数

来源:互联网 发布:pageoffice php 编辑:程序博客网 时间:2024/06/03 22:08

SEH异常处理回调函数的参数定义如下:

_Handlerproc{_lpExceptionRecord,//指向一个EXCEPTION_RECORD结构_lpSEH,//指向EXCEPTION_REGISTRATION结构地址_lpContext,//指向CONTEXT结构_lpDispatcherContext}

返回值:

ExceptionContinueExcetion(等于0):回调函数返回后,系统将线程环境设置为_lpContext参数指定的CONTEXT结构并继续执行;

ExceptionContinueSearch(等于1):回调函数拒绝处理这个异常,系统将通过EXCEPIONT_REGISTRATION结构的prev字段得到前一个回调函数的地址并调用它;

ExceptionNestedException(等于2):回调函数在执行中又发生了新的异常,即嵌套异常;

ExceptionCollidedUnwind(等于3):发生了嵌套的展开操作。

CONTEXT结构成员可以改变,这意味着程序可以用改变的CONTEXT内容去执行程序,如清除断点,改变代码运行路线等。例如:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Include 文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  include windows.inc   include user32.inc   include kernel32.inc     includelib user32.lib   includelib kernel32.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>      .dataCaption db "SEH",0TextSEHdb "Hello,SEH!",0Textdb "SEH程序没有运行",0;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   .code_start:;********************************************************************; 在堆栈中构造一个 EXCEPTION_REGISTRATION 结构;********************************************************************        Assume FS:NOTHING        push  offset perThread_Handler        push  fs:[0]               mov   fs:[0],esp  ;********************************************************************; 会引发异常的指令;********************************************************************            mov   esi,0mov   eax,[esi] WouldBeOmit:                                          invoke  MessageBox,0,addr Text,addr Caption,MB_OK    ;这一句将无法被执行                 ;********************************************************************; 异常处理完毕后,从这里开始执行;********************************************************************  ExecuteHere:                                   invoke   MessageBox,0,addr TextSEH,addr Caption,MB_OK;********************************************************************; 恢复原来的 SEH 链;********************************************************************        pop     fs:[0]                              add     esp,4 ;********************************************************************        invoke  ExitProcess,NULL        ;********************************************************************; 将 EIP 指向ExecuteHere处的位置并恢复堆栈;********************************************************************perThread_Handler proc uses ebx pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD                mov     eax,pContext         Assume  eax:ptr CONTEXT        lea     ebx, ExecuteHere  ; 异常后准备从ExecuteHere后开始执行        mov     [eax].regEip,ebx          xor     ebx,ebx        mov     [eax].iDr0,ebx    ; 对Drx调试寄存器清零,使断点失效(反跟踪)        mov     [eax].iDr1,ebx        mov     [eax].iDr2,ebx        mov     [eax].iDr3,ebx        mov     [eax].iDr7,341             mov     eax,0             ; ExceptionContinueExecution,表示已经修复        ret                    perThread_Handler endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end _start


0 0
原创粉丝点击