在Win32中怎样在自己的栈上添加SEH链头部?
cgaga 2002-01-04 04:21:24 在Win32中怎样在自己的栈上添加SEH链头部?
我创建了一个自己的运行栈
通过更改esp可以让程序在它上面运行
但是Win32提供的结构化异常处理(SEH)确失效了
不管使用
__try{...}__except(...){...}
__try{...}__finally{...}
还是c++的标准异常处理
try{...}catch(...){...}
都不行
我查阅《Windows核心编程》中有关SEH的内容
发现系统通过一个堆栈上的SEH链来实现多层异常捕获功能的嵌套。
我有查看了vc的汇编代码,发现每个使用到SEH的函数初始化处都有相同的结构
有别于普通的函数
//这两行构造函数的运行框架,每个函数都有
00401300 push ebp
00401301 mov ebp,esp
//这里是特别的地方
00401303 push 0FFh
00401305 push offset string "asdas"+0Ch (00420070)
0040130A push offset __except_handler3 (00401684)
0040130F mov eax,fs:[00000000]
00401315 push eax
00401316 mov dword ptr fs:[0],esp
//以下的代码也容易理解
0040131D add esp,0B8h
00401320 push ebx
00401321 push esi
00401322 push edi
其中 40130f,401315,401316三行明显构成了一个链表,类似于函数运行框架链表
这是SEH链表在栈上的结构
fs:[0] >-----------+ +-----------------+ +----->最终指向什么东西??
| | | |
---------------------V-|-----------------V-|--------
..... | + | .... | + |.... | 《-运行栈
----------------------------------------------------
我不知道链最终指向什么东西,我试过NULL,-1好像都没用
各位高手帮帮忙了??!