SEH技术
结构化异常处理
当某一线程发生异常时,程序的控制权会立即进入Ring0异常处理程序,这是属于操作系统的部分,
如果发生的异常是如页异常之类的异常,Ring0处理程序可以处理完它后重新回到程序中执行,而被中断
过的进程可能根本就不知道发生过异常。
但事情并不总是如此,有时进程会发生一些始料不及的异常,例如访问不存在的内存,被0除等,
这些异常Ring0处理程序不知该如何处理它,而进程本身也可能想自己处理这些情况,这是就要用到结构化异常处理(SEH)。在C/C++中也有异常处理的语句如_try,_catch等,这些语句的实现也与SEH紧密联
系。
当系统遇到一个它不知道如何处理的异常时,它就查找异常处理链表,注意每个线程都有它自己的异
常处理链表。异常链表以FS:[0]所指向的位置为链表头。
异常处理开始时,系统把一些与当前线程和与异常有关的内容传给链头所指向的处理程序;处理程序
由用户编写或编译器生成,它的返回值可以是告诉系统:异常处理以完成,可以继续执行程序,或未处理
异常,可由链表的下一个处理程序处理等,可以一次传递下去。
下面给出一个例子:
-------------------------------------------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
include user32.inc
include windows.inc
includelib kernel32.lib
includelib
user32.lib
.data
szCaption
db "SEH",0
szTextSEH db "SEH 程序正在运行",0
szText db
"SEH 程序没有运行",0
.code
start:
lea eax,[esp-4*2]
xchg fs:[0],eax
;这一行编译错误,哪位大虾指点一下正确格式
mov ebx,offset SEH
push ebx
push eax
mov esi,0
mov eax,[esi]
invoke MessageBox,0,offset szText,offset szCaption,MB_OK
jmp Exit
SEH:
invoke MessageBox,0,offset
szTextSEH,offset szCaption,MB_OK
Exit:
invoke ExitProcess,0
end start
end
-------------------------------------------------------------------------------------------
后记:看雪老师托我写个SEH相关的东东,我哪里懂这些?临时报佛脚从书上抄了这么一段SEH的简单介绍
给大家,目的是让大家对SEH不再感到神秘,进一步理解SEH的运行机制。
文中的源程序是书上抄下来的,作者说在Tasm中编译通过,可是我手头没有Tasm,用Masm32V6编译
上面的那一行老是出错,我不知道在Masm中,段前缀如何设置,还请哪位大虾指教! (夜月)
SEH即结构异常处理,暂没整理,只提供一些英文资料,下载。