WindowsXP中新型向量化异常处理.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows XP中的新型向量化异常处理 原名:New Vectored Exception Handling in Windows XP 作者:Matt Pietrek 到现在为止我已在 Win32®平台上工作八年有余,在这期间里我积累了一些我所喜欢使用的 Win32 功能(从 API 层面上来说)。它们可以让我的编程生活更轻松,同时也让我更容易写出比 较有用的工具。当我安装完 Windows XP Beta(以前代号为“Whistler”)时,并没有指望能够 看到许多新的 API,结果却惊喜地发现我错了!在本月的专栏中,我就要讲述这些新增功能其中 之一——向量化异常处理(Vectored Exception Handling)。 当运行我在1997 年 11 月MSJ杂志Under The Hood专栏中介绍的PEDIFF程序时,我发现了向 量化异常处理。你告诉PEDIFF两个不同版本DLL的路径,它就会返回这两个DLL导出的不同函数。 这一次我比较了Windows 2000 中的KERNEL32.DLL和Windows XP中的KERNEL32.DLL,结果发现了 向量化异常处理。Windows XP中的KERNEL32.DLL中新增了许多API,但我一眼就注意到了 AddVectoredExceptionHandler这个API。在最新的MSDN® Library中有这个API的文档,因此我也 不需要挖掘这方面的信息了。 由于Beta 2版本中的 WINBASE.H有一个问题,因此你需要安装Platform SDK RC1发行版才 能编译本文中所讲的代码。 快速回顾结构化异常处理 到底什么是向量化异常处理,为什么要关注它呢?首先让我们来快速回顾一下通常的异常 处理机制,这样你就会明白向量化异常处理与它之间的区别了。如果你使用的是像C++那样的支 持异常处理的语言,你很可能已经知道Win32结构化异常处理(Structured Exception Handling, SEH)了。在C++中是使用try/catch语句或者是Microsoft C/C++编译器扩展的__try/__except 语句来实现结构化异常处理的。关于SEH的内部工作机制,可以参考我在1997年1 月的MSJ杂志 上发表的文章“深入探索Win32结构化异常处理(A Crash Course on the Depths of Win32 Structured Exception Handling)”。 简单地说,结构化异常处理使用了基于堆栈的异常结点。当你使用try 块时,有关异常处 理程序的信息被保存在当前过程(函数)的堆栈帧上。在 x86 平台上,Microsoft使用了保存在 FS:[0]处的指针来指向当前的异常处理程序帧。这个帧中包含了异常发生时需要被调用的代码的 地址。 如果你在一个 try 块中调用另一个函数,这个新函数可能设置它自己的异常处理程序。此 时在堆栈上就创建了一个新的异常处理程序帧并且有一个指针指向前一个异常处理程序帧,如图 1 所示。实际上,所有的SEH 帧形成了一个链表,FS:[0]指向这个链表的头部。这里要注意的关 键地方是:链表中每个后继结点必须处于线程堆栈上更高的位置。操作系统强制实行这个特别的 规定,这就意味着你不能随意地将自己的异常处理程序插入到这个链表中。 图 1 堆栈上的异常处理程序 所有的异常处理帧在堆栈上以链表的形式存在并不是SEH 中的一个小细节,它对 SEH 的正 常工作是至关重要的。当异常发生时,操作系统从这个链表的头部开始,用类似于“现在发生了 一个异常,你想处理它吗?”这样的代码来调用这个异常处理程序。异常处理程序可以修复出错 的问题并返回 EXCEPTION_CONTINUE_EXECUTION 来表示它处理了这个异常。 异常处理程序也可以通过返回 EXCEPTION_CONTINUE_SEARCH 来表示它拒绝处理异常。当发 生这种情况时,操作系统移向链表中的下一个结点,并询问同样的问题。这个过程一直进行下去, 直至某个异常处理程序选择处理这个异常或者到链表末尾。我在这里极大地简化了 SEH 的细节, 但这对于我们来说已经足够了。 SEH如此设计导致的后果是什

文档评论(0)

aa15090828118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档