• Windows内核读书笔记——SEH结构化异常处理


    SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中。

    SEH提供了终结处理异常处理两种功能。

    终结处理保证终结处理块中的程序一定会被执行

    1 __try
    2 {
    3 //要保护的代码
    4 }
    5 __finally
    6 {
    7 //终结处理块
    8 }

    退出保护块的方式:正常结束和非正常结束两种

    1.正常结束

    正常执行并顺序进入终结处理块称为正常结束

    2.非正常结束

    因为发生异常或是因为return、goto、break、continue等流程控制语句而离开被保护块的称为非正常结束

    在终结处理块中使用AbnormalTermination获取被保护块的退出方式。

    __leave关键字在被保护块中使用,立即结束被保护块。属于正常退出。

    异常处理功能用于处理异常

    1 __try
    2 {
    3 //被保护块
    4 }
    5 __except(过滤表达式)
    6 {
    7 //异常处理块
    8 }

    提供了两个宏,可在过滤表达式或异常处理块内使用

    GetExceptionCode()返回异常代码

    GetExceptionInformation()返回一个EXCEPTION_POINTERS结构中

    1 typedef struct _EXCEPTION_POINTERS {
    2   PEXCEPTION_RECORD ExceptionRecord;//异常记录指针
    3   PCONTEXT          ContextRecord;//线程上下文指针
    4 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

     过滤表达式可以是常量,函数调用也可以是条件表达式,但最后值必须是1、0、-1之一。

    EXCEPTION_CONTINUE_SEARCH(0)本保护块不处理异常,系统继续搜索其他保护块

    EXCEPTION_CONTINUE_EXECUTION(1)已经处理异常,程序回到异常点继续运行

    EXCEPTION_EXECUTE_HANDLE(-1)让本保护块来处理这个

    CONTEXT结构是用于恢复线程执行用的,其中保持了线程上下文。

    在现实中,由于各种情况过滤表达式很难把异常处理到继续运行的情况。

    所以VC规定C++异常的异常过滤函数禁止返回EXCEPTION_CONTINUE_EXECUTION,即禁止回到异常点继续运行。

    栈展开,由于异常处理导致程序的函数执行流程出现跳跃性,所以要把栈恢复到合适执行的位置(情况),

  • 相关阅读:
    Python 流媒体播放器(基于VLC)转载
    从2011年用工荒现象看中国人口结构的周期波动
    软件供应链安全现状分析
    vue中this.$nextTick()的用法
    C#中几种数据格式保存xls(DataTable 和List 保存xls) DataGridView转DataTable
    element 报错:Unexpected reserved word 'await'
    C# winfrm程序的主入口捕获项目的全部异常
    利用C#怎么获取 List集合中的重复值Linq操作
    cesium 自定义时间轴 通过改变时间设置光照效果[转]
    CESIUM 原理 之 COMMAND拼接【转】
  • 原文地址:https://www.cnblogs.com/Ox9A82/p/5380539.html
Copyright © 2020-2023  润新知