Windows核心编程笔记-Windows提供的结构化异常处理(SEH)

细说windows的异常处理和实现——结构化异常 C++里面有使用异常处理的机制,但是那些需要throw catch捕捉等操作 而通常一个win程序,我们会因为各种原因导致其crash,而不一定是throw 了某个exception。我们需要这样一个机制,可以在程序因为各种原因crash时掌握程序的情况,并能够做点事情,这就是所谓的“优雅的结束”。win api恰为我们提供了这样一个函数SetUnhandledExceptionFilt 阅读详情

Windows提供的结构化异常处理(SEH)
   1.结束处理主要是由编译器来实现,异常处理操作系统实现的要多一些
   2.当异常块出现时,编译器要生成特殊的代码,并且生成一些表结构来处理SEH,另外还要生成
     一些回调函数
   3.SEH与C++的异常处理不同
一、结束处理
   1.使用形式
   _try
   {
     //processing
   }
   _finally
   {
     //主要是一些后处理、内存回收、Release等
   }
   2.当以下三种情况发生时,进入_finally
     a. _try块代码自然执行完成
     b. _try块中调用return,goto,longjump,break等导致跳出_try块时
     c. _try块代码执行中由于调用其他函数发生异常,书中把这个叫做全局展开(global unwind)
     注意,当调用exitthread exitprocess terminatethread terminateprocess时,不进入finally
   3.编译器如何实现
     _try块中查找可能导致跳出的return、goto等语句,发现后,将finally函数在该处展开。
     将会导致编译时的时间开销变大
   4.个人感觉
     如果你担心由于异常会使程序中的一些该释放的资源没有释放,则可以试一试
     其他感觉用处不是很大,书中所举结束处理使代码可读性增强的例子,说服力不强
二、异常处理
   1. 使用形式
   _try
   {
 //processing
   }
   _except(EXCEPTION_EXECUTE_HANDLER)    //也可以是EXCEPTION_CONTINUE_SEARCH或者EXCEPTION_CONTINUE_EXECUTE
  {
 //对异常的处理
  }
  2 过滤器的三种条件分别表示
   EXCEPTION_EXECUTE_HANDLER:执行except块,执行完except块以后,接着执行except块之后的代码,而不会返回到出现异常的代码
   EXCEPTION_CONTINUE_SEARCH:搜索更高层的except进行执行
   EXCEPTION_CONTINUE_EXECUTE:继续执行
  3 全局展开
    确定了一个出现异常后,如何寻找相应的finally和except的流程
    基本规则是先内后外,再从外到内,最后由内而外,是不是晕了哦
    先执行finally,后finally
  4 GetExceptionCode
    DWORD GetExceptionCode(VOID);
    有10几种异常,感兴趣msdn之
  5 软件异常
    也就是自己通过调用函数报告异常
    RaiseException
    VOID RaiseException(
  DWORD dwExceptionCode,       // exception code
  DWORD dwExceptionFlags,      // continuable exception flag
  DWORD nNumberOfArguments,    // number of arguments
  CONST ULONG_PTR *lpArguments // array of arguments
);
三、未处理异常和C++异常
   1 UnhandledExceptionFilter
     LONG UnhandledExceptionFilter(
    STRUCT _EXCEPTION_POINTERS *ExceptionInfo
  );
  主要功能:弹出一个对话框,该对话框对出现的异常进行了一些描述,提示用户是否要进行调试。
  如果选择终结该进程,则执行except块,否则调用调试程序,调试程序attach到当前进程,开始进行调试
  这样的对话框大家估计都见过,反正程序出现问题的时候经常会看到
  2 使用形式
   实际主要用在函数basethreadstart和baseprocessthread两个函数上
   这两个函数是createthread或createprocess后,创建完线程堆栈,初始化完成线程内核对象和contex结构后,IP所指向的函数
   也就是线程执行时调用的第一个函数
   他的定义大概是这样的
   void basethreadstart(pfnstartaddr, pvParam)
   {
      _try
        {
           ExitThread((pfnstartaddr)(pvParam)));
        }
      _except(UnhandledExceptionFilter(GetExceptionInformation()))
        {
           ExitProcess(GetExceptionCode());
        }
   }
  所以很多程序错误是弹这个框框也就不足为怪了
  另外,如果内核模式出现了未处理的C++异常时,机器直接蓝屏,呵呵
 3 与C++异常机制的比较
   书中提到,VC++中,C++的异常处理实际上是用_try和_except实现的
   SEH                       C++
  _try                       try
  _except                    catch
  RaiseException             throw
  有几点不同
  a. c代码中不能用c++这套机制
  b. SEH中提供的功能还是要更强大一些
  c. 个人觉得C++还是用自己的异常处理机制比较好

   
  
 

《Windows核心编程》之“SEH” SEH,Structured Exception Handling(结构化异常处理),包括两种类型:一是Termination Handling,即终止处理;另一个是Exception Handling。本文主要介绍Termination Handling。 一、Advantages of Termination 阅读详情

相关推荐

《Windows核心编程》若干知识点实战应用分享

《Windows核心编程》若干知识点应用实践分享,希望大家能够仔细研读,在提升理论知识水平的同时,也能有效地提高分析解决问题的技能。

dvlinker的技术专栏 3万+

【逆向工程核心原理:SEH】

reverse

qq_42363151的博客 1822

C++异常处理与Windows SEH机制实战演示

在C++编程语言中,异常处理是一种处理程序运行时错误的有效机制。本章节将对C++标准异常处理机制做基础性的介绍,让我们从宏观上理解异常处理的基本概念、结构以及其在代码中的应用。异常处理能够使程序在遇到错误时跳转到相应的错误处理代码块,而不需要在代码中手动检测每一个可能的错误。这不仅使代码结构更加清晰,也提高了程序的健壮性。我们将从以下几个方面来展开介绍:异常处理机制的基本原理:异常对象、异常处理栈展开。C++异常与函数的返回值、错误码的比较:更清晰、更易于管理的错误处理方式。

weixin_42577735的博客 882

[原创]windows-SEH详解

SEH是window操作系统默认的异常处理机制,逆向分析中,SEH除了基本的异常处理功能外,还大量用于反调试程序(这里SEH时保存在栈中的,漏洞利用的时候会用到) 1.SEH SEH是windows操作系统异常处理机制,在程序源代码中使用__try,__except,__finally关键字来具体实现。 2.OS异常处理的办法 2.1正常运行时候的异常处理方法 进程运行过程中若发生异常,OS会委托进程进行处理。若进程代码中存在具体的异常处理(如SEH异常处理器)...

whl0071的专栏 4832

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5805

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 537

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

SEH 的工作原理。         Windows 程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。我们同样可以把异常也当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。当然,如果我们

Mobidogs Blog 1920

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

上一期分析了MATLAB的黄金算法原理,这一期进行Simulink模块分析。

WZT725的博客 2086

逆向基础-Windows异常

Windows异常机制

AppWhite_Star的博客 1251

C++(Qt)软件调试---Windows下Qt使用dump定位崩溃位置(1)

在C++/Qt程序崩溃时,往往很难找到崩溃的原因,如果是稳定复现的问题还好,但是多数情况遇见的问题是随机出现的,这时想要快速找到问题并解决就需要通过dump文件定位崩溃位置。

mahuifa的博客 1万+

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 257

Windows 系统编程初探 (四)结构化异常处理之一:SEH的基本原理与进程相关异常处理

        上面的内容只是一些基础知识,虽然简单,但有必要了解一下。现在,我将正式开始我的第一个专题:结构化异常处理(SEH)。SEH 是 Windows 系统提供的功能,跟开发工具无关。值得一提的是,VC 将 SEH 进行了封装,也就是我们平常用到的 __try{}__except(){} 和 __try{}__finally{},我没有研究过它的实现方法,这里也不进行讨论,而我将要讲述的是

xlt123的专栏 2239

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构

本文记录的是基于RepVit的YOLOv11轻量化改进方法研究。RepVit的网络结构借鉴ViT的设计理念,通过分离的token mixe和减少推理时的计算和内存成本,同时减少扩展比率并增加宽度,降低延迟,并通过来弥补参数大幅减少的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和五种模型,以满足不同的需求。

Limiiiing的博客 2975

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

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

dvlinker的技术专栏 5万+

利用 IP 中的集成调试功能来调试 PCI Express 链接训练问题

JTAG Debugger”和“In-system IBERT”功能结合在一起即可提供即时信息,用于判断链接训练问题的可能原因。“test_rd.tcl”文件可读取 BRAM 中存储的调试数据,并输出 *.dat 文件,如下所示。同样,您可能看到某一箭头旁的数字较大,表明可能存在不稳定的链接。要采集 PCIe 链接眼图,请在 IP 配置 GUI 的“Add. Debug Options”选项卡中选择“启用 In-System IBERT (Enable In-System IBERT)”选项。

qq_43416206的博客 534

【ArcPy】用Python批量处理大规模地理数据的几何校正

在许多GIS应用中,尤其是在大规模地理数据处理时,几何校正(Geometric Correction)是一个至关重要的任务。它确保了不同来源的地理数据能够正确地对齐和匹配,从而为后续分析提供准确的基础。几何校正的常见应用包括遥感影像的地理配准、矢量数据的投影转换等。几何校正通常包括坐标转换、重采样等步骤。以下示例展示了如何使用arcpy的工具进行几何校正。"""实施几何校正:param input_layer: 输入待校正数据层。

陈书予 997

[笔记]Windows核心编程《二十三》结构化异常处理

文章目录前言总结1.SEH(Structured Exception Handling)和SJLJ(SetJump LongJump)区别对比 前言 总结 1.SEH(Structured Exception Handling)和SJLJ(SetJump LongJump)区别对比

二次元怪兽的博客 871

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

对于结构化异常处理(SEH)的进一步探索

导读:对于结构化异常处理(SEH)的进一步探索 本文关键字:SEH, _except_handler3, Windows, VisualC

xu的blog 2460

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows逆向工程提升之x86结构化异常SEH处理机制

避免为每个try/except块生成独立的处理函数。:允许实现过滤器表达式评估、嵌套异常和异常转发。作为通用入口点,为所有异常提供一致的处理框架。:通用处理器可以执行额外验证和安全检查。:标识异常处理标志,是否可恢复等。:异常发生的指令地址。:异常附加参数个数。

0xCC说逆向 2171

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Windows核心编程:结构化异常处理

 作者:shenzi链接:http://blog.youkuaiyun.com/shenzi Windows核心编程:结构化异常处理     结构化异常处理(structured exception handling,SEH)带来的好处是我们在写代码时,可以先集中精力完成软件的正常工作流程。如果在运行的时候出现了什么问题,系统

shenzi的天空 3777

TypeScriptCompiler异常处理机制:Windows SEH与Linux异常处理的实现原理

TypeScriptCompiler是基于LLVM的TypeScript编译器,它在不同操作系统平台上实现了差异化的异常处理机制。本文将深入解析其在Windows系统采用的结构化异常处理(SEH)和Linux系统使用的异常处理实现原理,帮助开发者理解跨平台异常处理的核心技术。 ## 异常处理模块架构 TypeScriptCompiler的异常处理功能主要通过`TypeScriptExcepti

gitblog_01192的博客 1023

Windows异常世界历险记(一)——Windows系统用户级结构化异常处理机制(SEH)的基础知识和Unwind展开操作

Windows系统的用户级结构化异常处理机制(SEH)是基于线程的,因此可为不同的线程指派不同的异常处理函数。且由于其形成了链结构,还可据此为一个线程指定多个异常处理函数,异常发生后,操作系统会沿此链表调用各异常处理函数,直到某个异常处理函数修复了该异常或已达末尾。通常处理完异常后,需要执行展开(Unwind)操作,该操作先通知目标结点前的各异常处理函数释放资源,然后将之前的SEH链全部删除。

LPWSTR的博客 1936

《谈谈windows核心编程系列》 结构化异常处理SEH之__finally终止处理

转载自:http://blog.youkuaiyun.com/ithzhang/article/details/8790567 结构化异常处理SEH:__finally终止处理。     结构化异常处理(Structuredexception handling)简称SEH。是windows系统提供的异常处理机制。促使windows将SEH加入到windows系统的一个关键原因就是

收集学习过程中对自己有帮助的牛人文章 721

C++异常与结构化异常SEH的比较

结构化异常处理SEH(全称Structured Exception Handling),是Windows操作系统所提供的对错误或异常的处理机制,是Windows操作系统的一个重要组成部分。 在windows系统中,我们在开发应用程序时应该使用结构化异常还是C++异常?

拥抱变化 3212
下一篇: Wnsock编程初涉
moonson
博客等级 码龄21年 8粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值