;************************************************************************
;*项目名称:Thread SEH示例 *
;************************************************************************
;*代码名称:Thread SEH_2_1.asm *
;*代码功能:采用修改regEip值来修改程序流向的方式到指定位置处继续执行 *
;************************************************************************
;*代码作者:by lujue, 2006-10-30 *
;************************************************************************
;************************************************************************
;汇编模式定义
;************************************************************************
.386
.model flat,stdcall
option casemap:none
;************************************************************************
;头文件定义
;************************************************************************
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;************************************************************************
;数据段定义
;************************************************************************
.data
szCaption db "Thread SEH示例",0
szTextSEH db "We are in Thread Structured Exception Handler!",0
szTextOK db "修复了异常",0
szTextERR db "SEH程序没有运行",0
;************************************************************************
;代码段
;************************************************************************
.code
;********************************************************************
; 函数功能:异常处理回调函数:修改 regEip 使其指向ExecuteHere处的位置
;********************************************************************
perThread_Handler proc uses ebx pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD
invoke MessageBox,0,addr szTextSEH,addr szCaption,MB_OK
mov eax,pContext
Assume eax:ptr CONTEXT
lea ebx, ExecuteHere ; 异常后准备从ExecuteHere后开始执行
mov [eax].regEip,ebx
xor ebx,ebx
mov [eax].iDr0,ebx ; 对iDrx调试寄存器清零,使断点失效(反跟踪)
mov [eax].iDr1,ebx
mov [eax].iDr2,ebx
mov [eax].iDr3,ebx
mov [eax].iDr7,341
mov eax,ExceptionContinueExecution ; ExceptionContinueExecution equ 0,表示异常已经修复,从regEip指定地址处继续执行
ret
perThread_Handler endp
;************************************************************************
;程序入口
;************************************************************************
_start:
;********************************************************************
; 在堆栈中构造一个 EXCEPTION_REGISTRATION 结构
;********************************************************************
Assume FS:NOTHING
push offset perThread_Handler
push fs:[0]
mov fs:[0],esp
;********************************************************************
; 会引发异常的指令
;********************************************************************
mov esi,0
mov eax,[esi]
WouldBeOmit:
invoke MessageBox,0,addr szTextERR,addr szCaption,MB_OK ;这一句将无法被执行
;********************************************************************
; 异常处理完毕后,从这里开始执行
;********************************************************************
ExecuteHere:
invoke MessageBox,0,addr szTextOK,addr szCaption,MB_OK
;********************************************************************
; 恢复原来的 SEH 链
;********************************************************************
pop fs:[0]
add esp,4
invoke ExitProcess,NULL
end _start