;************************************************************************
;*项目名称:SEH示例 *
;************************************************************************
;*代码名称:SEH_1.asm *
;*代码功能:SEH跟踪分析 *
;************************************************************************
;*代码作者:by ljjue, 2006-10-30 *
;************************************************************************
;************************************************************************
;汇编模式定义
;************************************************************************
.386
.model flat,stdcall
option casemap:none
;************************************************************************
;头文件定义
;************************************************************************
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
;************************************************************************
;数据段定义
;************************************************************************
.const
szTitle db 'ok',0
szTextOK db '修复了异常!',0
szTextSEH db 'SEH succeed',0
;************************************************************************
;代码段
;************************************************************************
.code
;************************************************************************
;程序入口
;************************************************************************
Start:
assume FS:NOTHING
push offset perThread_Handler ;异常处理句柄,handler
push fs:[0] ;
mov fs:[0],esp ;建立SEH链
mov esi,0
mov eax,[esi] ;访问0内存异常
Exit:
invoke MessageBox,NULL,addr szTextOK,addr szTitle,MB_OK
;恢复SEH链
pop fs:[0]
add esp,4
invoke ExitProcess,NULL
;************************************************************************
;函数功能:异常处理回调函数
;************************************************************************
perThread_Handler:
invoke MessageBox,NULL,addr szTextSEH,addr szTitle,MB_OK
push ebp
mov ebp,esp
mov ebx,[ebp + 10h]
assume ebx:ptr CONTEXT
mov [ebx].regEsi,00401000h ;修复寄存器使其不为0
assume ebx:nothing
mov eax,ExceptionContinueExecution ;ExceptionContinueExecution equ 0,表示已经修复异常,可从异常发生处或修改后的EIP处继续执行,否则你会陷入死循环,不断跳出对话框....
mov esp,ebp
pop ebp
ret
End Start