| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3151 人关注过本帖
标题:关于SEH异常处理回调函数的设置的理解~~请大家指正~~
只看楼主 加入收藏
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
结帖率:100%
收藏
 问题点数:0 回复次数:5 
关于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-08-22 23:56
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
继续往下学习的时候,发现自己这样理解这个问题也是过得去的~~
这点暂时不麻烦大家了.
2008-08-23 23:19
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
就是这样的.

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

不过一般都是讲SEH链是在链尾添加,
新的EXCEPTION_REGISTRATION结构看成是链尾结点.从指针名称也可以看出来 PREV-----前驱指针.
2008-08-31 14:34
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
[bo][un]你们都要疼我哦[/un] 在 2008-8-31 14:34 的发言:[/bo]

就是这样的.

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

不过一般都是讲SEH链是在链尾添加,
新的EXCEPTION_REGISTRATION结构看成是链尾结点.从指针名称也可以看出来 PREV-----前驱指针.

谢谢~~我又长见识了。
请教:PREV 是哪几个单词的缩写?我想加深认识它~~
2008-09-02 23:18
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
这个倒不太清楚, 以前记得学过什么语言, 前驱是PRE 后继是NEXT  就是这样来表示的.


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

这个的重点是在栈中构造一个新结构,我们都理解的不错
2008-09-03 01:47
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
回复 5# 你们都要疼我哦 的帖子
谢谢.
2008-09-03 21:57
快速回复:关于SEH异常处理回调函数的设置的理解~~请大家指正~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016915 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved