最初发布在QQ空间,见:SEH中的prolog和epilog,内有贴图。
使用SEH的代码都需要构建栈桢,支持exception处理的栈桢,而重复的代码就应当提炼成函数,微软自然不会例外。为此系统提供了prolog和epilog系列,类似的函数有不少版本,但大同小异。这次不用调试器,分析下__SEH_prolog4_GS和__SEH_epilog4_GS 2个函数,看看它们如何工作支持异常的栈桢结构。
先看看prolog,这是内核函数KiDispatchException调用__SEH_prolog4_GS的代码,
000 push 0F8h
004 push offset off_8488DCE0
008 call __SEH_prolog4_GS
调用函数前传递2个参数,一个是需要保留的栈的大小,一个是指针。
再看看函数代码本身,详细的注释在代码后面,
; two instrucitons before call it.
;
; take KiDispatchException as example,
;
; 000 push 0F8h ; it's used as a stack size
; 004 push offset off_8488DCE0 ; it's pointer to scope table entry.
__SEH_prolog4_GS proc near
arg_4= dword ptr 8
000 push offset __except_handler4
004 push large dword ptr fs:0
008 mov eax, [esp+8+arg_4] ; so now there are 5 values in stack.