| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 551 人关注过本帖
标题:关于SEH异常处理回调函数的设置的理解~~请大家指正~~
收藏  订阅  推荐  打印 
本主题由 zklhp 于 2008-9-29 19:30 设置高亮
ONEPROBLEM
Rank: 12Rank: 12Rank: 12
来自:编程中国
等级:版主
威望:8
帖子:1381
积分:12632
注册:2008-7-11
关于SEH异常处理回调函数的设置的理解~~请大家指正~~

我在自己的空间里,写了个日记,是关于SEH异常处理回调函数的设置的问题~~
我是用单链表的头插入法来理解的,很担心自己的理解并不正确。所以,现在贴到论坛来,希望大家给提下意见~~

原文:
==============================================================================================
在Win32汇编中,对于SEH异常处理回调函数的设置,只有3条简单的指令,但要真正理解起来,还真不容易.
指令如下:
push    offset  _Handler   ;回调函数地址入栈
push    fs:[0]             ;原先的EXCEPTION_REGISTRATION 结构地址入栈
mov     fs:[0],esp         ;把当前栈顶地址赋予fs:[0]

如果只看这3条指令是无法理解的,必须结合单链表的头插入法来理解它.
首先,可以把fs:[0] 当作头指针来看待;(注意:fs:[0]就是NT_TIB结构中ExceptionList 的值!)
头指针fs:[0]指向一个SEH单链表! 且指向的是链表的第一个结点:第一个EXCEPTION_REGISTRATION 结构!
当从SEH链表的头部插入一个新的结点(即新的EXCEPTION_REGISTRATION结构)的时候,要修改两个指针!
即,把第一个结点的地址放入新的EXCEPTION_REGISTRATION结构的prev 字段中,把新的EXCEPTION_REGISTRATION结构的地址赋予头指针fs:[0].
而上面的3条指令正是这么做的,但最巧妙的是:竟然把新的结点放到了栈中!!!
push    offset  _Handler 结点的数据域入栈!
push    fs:[0]  头指针值入栈!
这两条指令正好在栈中构造了一个新的结点,即新的EXCEPTION_REGISTRATION结构![esp + 4]是字段Handler;[esp]是字段prev,且prev的值就是原先第一个结点的地址!
再 mov     fs:[0],esp 把当前栈顶地址放入fs:[0],这等于把新结点的地址赋予了头指针!(特别注意:是esp赋予了头指针,而不是[esp]的值赋予了头指针!)

真的很巧妙啊~~~
========================================================================
搜索更多相关主题的帖子: 理解  回调函数  SEH  
2008-8-22 23:56
ONEPROBLEM
Rank: 12Rank: 12Rank: 12
来自:编程中国
等级:版主
威望:8
帖子:1381
积分:12632
注册:2008-7-11

继续往下学习的时候,发现自己这样理解这个问题也是过得去的~~
这点暂时不麻烦大家了.
2008-8-23 23:19
你们都要疼我哦
Rank: 12Rank: 12Rank: 12
来自:火星
等级:版主
威望:8
帖子:186
积分:2581
注册:2008-7-13

就是这样的.

在栈中构造一个新的EXCEPTION_REGISTRATION结构.

不过一般都是讲SEH链是在链尾添加,
新的EXCEPTION_REGISTRATION结构看成是链尾结点.从指针名称也可以看出来 PREV-----前驱指针.
2008-8-31 14:34
ONEPROBLEM
Rank: 12Rank: 12Rank: 12
来自:编程中国
等级:版主
威望:8
帖子:1381
积分:12632
注册:2008-7-11

你们都要疼我哦 在 2008-8-31 14:34 的发言:

就是这样的.

在栈中构造一个新的EXCEPTION_REGISTRATION结构.

不过一般都是讲SEH链是在链尾添加,
新的EXCEPTION_REGISTRATION结构看成是链尾结点.从指针名称也可以看出来 PREV-----前驱指针.
谢谢~~我又长见识了。
请教:PREV 是哪几个单词的缩写?我想加深认识它~~
2008-9-2 23:18
你们都要疼我哦
Rank: 12Rank: 12Rank: 12
来自:火星
等级:版主
威望:8
帖子:186
积分:2581
注册:2008-7-13

这个倒不太清楚, 以前记得学过什么语言, 前驱是PRE 后继是NEXT  就是这样来表示的.


这部分内容因为没公开,资料也很少, 大概看看就行,很多地方我也理解不深.
头和尾的概念都是相对的,我也是从它指针名称讲的PREV前驱指针,后面新加的是尾巴. 如果看成是单向链表,当然也能讲它是加的头. 不过如果按照习惯,就应该是NEXT而不是PREV了.

这个的重点是在栈中构造一个新结构,我们都理解的不错
2008-9-3 01:47
ONEPROBLEM
Rank: 12Rank: 12Rank: 12
来自:编程中国
等级:版主
威望:8
帖子:1381
积分:12632
注册:2008-7-11
回复 5# 你们都要疼我哦 的帖子

谢谢.
2008-9-3 21:57
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.067148 second(s), 10 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved