SEH结构化异常处理

原创 2006年06月04日 07:39:00

千言万语从何说起呢?嗯,还是先说说SEH的特点吧:

SEH的优点在于当你编写代码的时候,可以集中注意力完成任务,如果在运行的时候出现了问题,系统会捕获到错误并且通知你出了问题.

使得SEH工作的任务主要落在编译器而不是操作系统上.当进入,退出异常块时候,你的编译器必须产生特殊的代码.编译器必须产生处理SEH的数据结构,还必须提供操作系统能调用的回调函数来使得异常块能被遍历.编译器还负责准备栈框架何别的供操作系统使用和引用的内部信息.

不同厂家的编译器对实现SEH的方法也许不一样,但功能上大致是一样的,所以我们这里可以忽略SEH具体的实现细节.大多数厂家都遵循了Mircosoft建议的语法.

这里一定要记住:千万不用把SEH同C++的异常处理混淆.C++的异常处理是另外一种异常处理的形式,他使用C++中的try,catch和throw关键字.microsoft 在Visual C++ 2.0的时候加入了C++异常处理.关于C++的异常处理我想在下一篇文章来阐述.

(SEH)结构化异常处理中的关键字:

 __try,__finally,__leave,__execept

(SEH)结构化异常处理的功能分类:

1终止处理程序,2异常过滤程序,3异常处理程序.,4软件异常.

下面就对这四种形式加以讨论.首先来看看终止处理程序.所谓的终止处理程序,是__try {} __finally{}块.他的microsoft

语法是:(以下如果没有特殊说明,指的都是mircosoft的语法)

__try

{

  //Guaded body

...

}

__fianlly

{

 // Termination handler

...

}

关键字 __try 和__finally描述终止处理程序的两个部分.在上面的代码中,操作系统和

编译器一起确保终止处理程序的中__finally代码块被执行,而不管被保护体__try是怎样退出的.

也就是就算你在__try中加如了return,goto,或者longjump,终止程序都会被执行.下面是代码执行的流程:

//1 先于__try块的代码被执行

__try{

  //2 __try中的代码被执行

}

__finally{

 //3 __fianlly中代码被执行

}

// 4 __fianlly后面的代码被执行.

也许这样的描述还不够清楚,是的,要了解SEH是如何工作的,最好的办法就是写段代码来测试一下:

DWORD Fun(void)

{

   DWORD dwTemp;

  // DO any thing u want here

  __try

 {

   WaitForSingleObject(G_hSign,INFINITE);

  dwTemp = 5;

  return dwTemp;

 }

__finally

 {

   ReleaseSemaphore(G_hSign,1,NULL);

 }

 dwTemp = 9;

return dwTemp;

}

也许你已经发现在__try中有一个return语句,如果__finally不被执行的话,那么信号量就不会释放,程序的流程

就出问题了.请记住SEH终止处理程序保证在__try中过早退出时,__finally中代码一定会被执行,然后才返回.

这被称为局部展开(local unwind) 

如果真的想早点跳出__try 块,请使用__leave这个关键字。他的用法如下:

__try

{

 // condition test

__leave;

 //another conditon test

 __leave;

//so on

}

__finally

{

//do some clean up job here

}

__leave关键字的含义是: 在__try中使用__leave关键字将导致一个到__try快末尾的跳转,而后进入到__finally 块。

__finally块中的代码被执行有三种可能性:

1 程序自然的从__try中进入__try.

2 从try块中过早的退出如使用了goto, longjump,continue,break,return等强迫控制转移到__finally块。

3 是全局展开,不用显式的表明,比如我们在__try 块中调用了一个函数,而这个函数引起了内存访问错误

  那么__finally块中的代码也会被执行。如下面的代码

void Dofnc()

{

  char*  buffer = 0;

   *buffer = 0x30;

}

 

__try

{

   Dofnc(); //这个函数引起一个内存访问错误。

  //其他的代码

}

  __finally

{

  //do clean up job here

}

BOOL AbnormalTermintion(void) 这个函数可以使我得知程序是正常进入还是异常(全局,局部)进入__finally块。

AbnormalTermintion返回TRUE 表示异常进入,FALSE表示正常进入__finally

 

深入解析结构化异常处理(SEH)

深入解析结构化异常处理(SEH) 一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗. 1997年文章,Windows技术的根一直没变: http://www.mic...
  • u011565209
  • u011565209
  • 2016年06月27日 18:33
  • 1812

结构化异常(SEH)简述

结构化异常处理程序? SEH:structured Exception Handling,结构化异常处理。 结构化异常处理,是Windows操作系统上,Microsoft对C/C++程序语言做的语法...
  • yygydjkthh
  • yygydjkthh
  • 2014年08月04日 00:59
  • 2614

[读书笔记] 关于Windows的结构化异常处理SEH(一)

结构化异常处理(一下简称SEH),实际上包含两方面的功能:终止处理(termination handling)和异常处理(exception handling),这篇笔记主要是关于终止处理,异常处理以...
  • shandongmachao
  • shandongmachao
  • 2015年04月24日 10:33
  • 389

深入研究Win32结构化异常处理(SEH总结篇)

深入研究Win32结构化异常处理(SEH总结篇)   本文假设你熟悉WIN32,C/C++。 引言:   本文是在《Win32 结构化异常处理(SEH)探秘》基础上做的更新总结。探索MS...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年04月10日 10:31
  • 1067

Windows核心编程笔记(十九) SEH结构化异常处理_未处理异常及向量化异常

UnhandledExceptionFilter函数详解  BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID lp...
  • wangpengk7788
  • wangpengk7788
  • 2017年02月13日 19:49
  • 551

深入解析结构化异常处理(SEH) - by Matt Pietrek

深入解析结构化异常处理(SEH) - by Matt Pietrek
  • chenlycly
  • chenlycly
  • 2016年09月18日 16:03
  • 1955

Windows核心编程笔记(十八) SEH结构化异常 一

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常   ①中断是由外部硬件设备或异步事件产生的   ②异常是由内部事件产生的,可分为故障、陷阱和终止...
  • wangpengk7788
  • wangpengk7788
  • 2017年02月08日 17:59
  • 287

windows核心编程--SEH(结构异常处理)

SEH 的工作原理。          Windows 程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(...
  • FrankieWang008
  • FrankieWang008
  • 2013年12月18日 09:55
  • 1135

结构化异常处理 与 非结构化异常处理 的区别

简单来说, 结构化异常处理是指使用包含异常的控制结构、隔离的代码块和筛选器来创建异常处理机制。  这样,您的代码可以区分不同类型的错误,并根据环境做出相应的响应。  在非结构化异常处理中...
  • dzweather
  • dzweather
  • 2013年08月31日 12:02
  • 1790

反调试—利用SEH链表

内容摘要:进程在被调试的时候,进程中TEB中的PEB中的BeingDebugged成员的值为1而正常情况下为0,于是通过访问该成员可知道当前是否为调试状态,来决定是否继续执行程序,原理和TLS反调试相...
  • qq_20977145
  • qq_20977145
  • 2016年08月03日 22:15
  • 902
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SEH结构化异常处理
举报原因:
原因补充:

(最多只允许输入30个字)