很久木有管博客了   最近也没有学什么

Dos系统下发生异常后,系统会调用int 24h服务例程,然后根据中断的返回值决定下一步要做什么,他会在屏幕上显示ignore Retry Fail Abort  让用户选择进而进行下一步操作

这样的话  只要应用程序截取int 24h中断,就可以随意的"胡作非为"了

Windows操作系统对异常的处理流程相对复杂,其依靠80x86的保护模式机制来主动捕获异常.

用SetUnhandledExceptionFilter函数设置异常处理回调函数

<span style="font-family:Microsoft YaHei;font-size:13px;">invoke SetUnhandledExceptionFilter,addr _Handlermov   lpOldHandler,eax</span>

函数返回的是原回调函数的地址

筛选器回调函数的格式如下

_Handler proc lpExceptionInfo

lpExceptionInfo  指向一个EXCEPTION_POINTERS结构

<span style="font-family:Microsoft YaHei;font-size:13px;">EXCEPTION_POINTERS STRUCTpExceptionRecord   DWORD  ?     ;指向一个EXCEPTION_RECORD结构ContextRecord      DWORD  ?     ;指向一个CONTEXT结构EXCEPTION_POINTERS ENDS</span>

(1)EXCEPTION_RECORD结构

<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct _EXCEPTION_RECORD { DWORD ExceptionCode;                                             //异常事件代码DWORD ExceptionFlags;                                            //异常标志    struct _EXCEPTION_RECORD *ExceptionRecord;                       //下一个Exception_Record结构地址PVOID ExceptionAddress; DWORD NumberParameters; ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
</span>

ExceptionCode指定了一系列的错误代码,说明了错误的原因

ExceptionFlags说明了错误的标志 ,由一系列的数据位组成

位0:代表发生的异常是否允许被恢复执行,当位0被复位的时候,表示回调函数在对异常进行处理后可以指定让程序继续运行,置位时候表示这个异常是不可恢复的,,这个时候程序最好进行退出前的扫尾工作,并选择终止应用程序,如果这个时候非要指定让程序继续执行的话,Windows会再次以EXCEPTION_NONCONTINUABLE_EXCEPTION异常代码调用回调函数.为了程序的可读性,可以通过2个预定义值来测试这个位,EXCEPTION_CONTINUABLE(定义为0)和EXCEPTION_NONCONTINUABLE(定义为1)

位1:EXCEPTION_UNWINDING标志.表示回调函数被调用的原因是进行了展开操作

位2:EXCEPTION_UNWINDING_FOR_EXIT标志,表示回调函数被调用的原因是进行最终退出前的展开操作

当异常处理函数的代码设计得不完善而在运行中引发新的异常时,回调函数会被嵌套调用,在这种情况下EXCEPTION_RECORD结构中的pExceptionRecord字段会指向下一个EXCEPTION_RECORD结构....如果没有发生嵌套异常,这个值为NULL
 (2)CONTEXT 线程上下文

<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct _CONTEXT {  //   // The flags values within this flag control the contents of   // a CONTEXT record.   //   // If the context record is used as an input parameter, then   // for each portion of the context record controlled by a flag   // whose value is set, it is assumed that that portion of the   // context record contains valid context. If the context record   // is being used to modify a threads context, then only that   // portion of the threads context will be modified.   //   // If the context record is used as an IN OUT parameter to capture   // the context of a thread, then only those portions of the thread's   // context corresponding to set flags will be returned.   //   // The context record is never used as an OUT only parameter.   //   DWORD ContextFlags;  //   // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is   // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT   // included in CONTEXT_FULL.   //   DWORD   Dr0;  DWORD   Dr1;  DWORD   Dr2;  DWORD   Dr3;  DWORD   Dr6;  DWORD   Dr7;  //   // This section is specified/returned if the   // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.   //   FLOATING_SAVE_AREA FloatSave;  //   // This section is specified/returned if the   // ContextFlags word contians the flag CONTEXT_SEGMENTS.   //   DWORD   SegGs;  DWORD   SegFs;  DWORD   SegEs;  DWORD   SegDs;  //   // This section is specified/returned if the   // ContextFlags word contians the flag CONTEXT_INTEGER.   //   DWORD   Edi;  DWORD   Esi;  DWORD   Ebx;  DWORD   Edx;  DWORD   Ecx;  DWORD   Eax;  //   // This section is specified/returned if the   // ContextFlags word contians the flag CONTEXT_CONTROL.   //   DWORD   Ebp;  DWORD   Eip;  DWORD   SegCs;              // MUST BE SANITIZED   DWORD   EFlags;             // MUST BE SANITIZED   DWORD   Esp;  DWORD   SegSs;  //   // This section is specified/returned if the ContextFlags word   // contains the flag CONTEXT_EXTENDED_REGISTERS.   // The format and contexts are processor specific   //   BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];  } CONTEXT;
typedef CONTEXT *PCONTEXT;
</span>

(3)异常处理程序的返回值

回调函数返回后,Windows执行默认的异常处理程序,这个程序会根据回调函数的返回值决定如何进行下一步动作

回调函数的返回值可以有3种取值:EXCEPTION_EXECUTE_HANDLER(定义为1),EXCEPTION_CONTINUE_SEARCH(定义为0)和EXCEPTION_CONTINUE_EXECUTION(定义为-1)

当返回值为1时,进程将被终止,但是在终止之前,系统不会显示出错提示对话框;当返回值为0时,系统同样将终止程序,但是在终止之前会显示出错的提示对话框.使用这2种返回值的时候,异常处理程序完成的工作一般是退出前的扫尾工作.

当返回值为-1时,系统将CONTEXT设置回去的并继续执行程序..

当异常的标志位为EXCEPTION_NONCONTINUABLE的标志位时候,不应该设置EXCEPTION_CONTINUE_EXECUTION返回值,这样只会引发一个新的异常

一个异常处理的小程序  ...

<span style="font-family:Microsoft YaHei;font-size:13px;">      .386.model flat,stdcalloption casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
includelib  user32.lib
includelib  kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>L macro var:VARARGLOCAL @lbl.const@lbl db var,0.codeexitm <offset @lbl>
endm
.data?
lpOldHandler    dd  ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;功能: 筛选器   ---全局的   Handler ---------  异常处理程序
;参数: 指向一个EXCEPTION_POINTERS
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Handler    proc    _lpExceptionPointLOCAL  @szBuffer[256]:bytepushad;关联esi到EXCEPTION_POINTERS结构体mov   esi,_lpExceptionPointassume esi:ptr EXCEPTION_POINTERSmov   edi,[esi].ContextRecord         ;指向一个EXCEPTION_RECORD结构mov  esi,[esi].pExceptionRecord      ;指向一个Thread Context结构assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT;弹出异常信息invoke   wsprintf,addr  @szBuffer,L("异常发生的位置:%08x,异常代码:%08X,标志:%08X"),[edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlagsinvoke MessageBox,NULL,addr @szBuffer,L("哈哈--异常啦"),MB_OK;回到安全地方mov      [edi].regEip,offset _SafePlaceassume edi:nothing,esi:nothingpopadmov        eax,EXCEPTION_CONTINUE_EXECUTIONret
_Handler endpstart:invoke   SetUnhandledExceptionFilter,addr _Handlermov        lpOldHandler,eax;下面是引发异常的指令xor  eax,eaxmov  dword ptr [eax],0;这里的代码没有被执行哦invoke MessageBox,NULL,L("这里没有被执行哦"),L("------"),MB_OK;安全地方
_SafePlace:invoke   MessageBox,NULL,L("哈哈 到安全地方啦"),L("成功"),MB_OKinvoke  SetUnhandledExceptionFilter,lpOldHandler    invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start</span>

Windows使用筛选器来处理异常相关推荐

  1. w10 保护你的计算机,win10smartscreen筛选器怎么关闭-“windows已保护你的电脑”的关闭方法 - 河东软件园...

    smartscreen筛选器是win10系统中自带的保护程序,其能够帮助用户检测仿冒网站,能够帮助用户正确的访问您所需要进入的网站,从而保护用户的上网安全,与此同时,其还能够防止系统安装恶意.病毒软件 ...

  2. Win10怎么关闭smartscreen筛选器检测功能?

    控制面板-->系统和安全-->安全性维护-->点左侧的"更改Windows smartscreen筛选器设置"选项-->将smartscreen筛选器设置为 ...

  3. DirectshowLib摄像头拍照的”未找到可用于建立连接的介质筛选器组合“ 解决办法...

    最近一个C/S项目需在客户端调用摄像头拍摄照片,使用的是DirectshowLib这个库. 大部分机器可以正常运行,但出现了两个用户电脑无法识别摄像头的异常,启动时直接抛出 "未找到可用于建 ...

  4. 调用 GetProcAddress 失败,在 ISAPI 筛选器 C:\Windows\Microsoft.NET...

    问题描述 在IIS添加完网站后,尝试浏览网站,报错:调用 GetProcAddress 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\ ...

  5. Win10用Windows照片查看程序打开图片+更改注册表后导致Win10任务栏Adobe PDF阅读器图标显示异常

    Win10用Windows照片查看程序打开图片 解决办法: 参考:https://jingyan.baidu.com/article/455a9950bb20bda166277824.html 上述操 ...

  6. 异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介

    异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介 参考文章: (1)异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介 (2)https://www. ...

  7. 怎么关闭windows中不在控制面板上的smartscreen筛选器

    smartscreen筛选器不在控制面板上 我的电脑系统时windows10家庭中文版,我的安全和维护界面如图,并没有更改smartscreen筛选器的选项: 后来在网上看到有人说,所有的控制都改到w ...

  8. 小技巧(3):peco、bat,软链接与硬链接,Linux Shell Options,Windows 展台模式,与统一写入筛选器

    Windows 下的 cat 和 grep ls.cat.grep这三个命令,往往是Linux初学者最先了解的.日常使用Linux时不可或缺的.对于Windows系统而言,同样有三个命令可以完成上述工 ...

  9. 如何更新 Exchange2003 SP2 中的智能邮件筛选器版本

    概要 本文介绍了可用于维护 Microsoft Exchange 2003 Service Pack 2 (SP2) 所附带的智能邮件筛选器版本 2 的更新过程. 在每月的第一个和第三个星期三,将通过 ...

最新文章

  1. Blender三维插图设计视频教程 3D Characters and Illustrations in Blender 2.9
  2. AI时代:推荐引擎正在塑造人类
  3. 牛客小白月赛5-F题: 圆(circle)
  4. 如何优雅地根治null值引起的Bug!
  5. 2019 年,10篇新颖到出格的 AI 论文
  6. 优化CSS在网页中的加载方式
  7. f ajax event,f:ajax onevent不能使用预定义函数,但可以使用内联函数
  8. iOS开发之线程间的MachPort通信与子线程中的Notification转发
  9. 使用 ABAP 开发的一个基于 Web Socket 的小工具,能提高程序员日常工作效率
  10. java hive查询_java程序调用hive查询的一个异常
  11. Spark面对OOM问题的解决方法及优化总结 (转载)
  12. 【05】CC - 格式
  13. 这可能是目前最全的Redis高可用技术解决方案总结
  14. C# ToolStrip 图标大小设置
  15. 前端流媒体:MSE入门
  16. import cv2 失败“找不到指定模块”解决办法
  17. 联合证券|“仰望”概念爆发,多股涨停!人气龙头股罕见“炸板”
  18. OrangePIPC2---bootrom
  19. Android键盘操作的函数:onKeyDown, onKeyUp, on, onKeyMultiple
  20. 计算机专业术语表白,围观!看各专业都怎么用术语表白的!

热门文章

  1. 51单片机按键控制数码管0~9_51单片机外部中断
  2. java instantiation,Instantiation of List (Java)
  3. CMD启动mysql服务“发生系统错误 5”的解决办法
  4. 有什么好一点的方法读jdk源码吗?
  5. glup打包代码不更新
  6. JS线程与事件循环解析
  7. srtvlet filter
  8. 闲话杂谈—至曾经的自己
  9. mysql复制模式第二部分-----双主模式
  10. 配置Ubuntu虚拟环境