Windows使用筛选器来处理异常

 

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


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>


 

 

 


 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 高级编程 RecyclerView 控件的使用

RecyclerView 是Android 新添加的一个用来取代ListView的控件&#xff0c;它的灵活性与可替代性比listview更好。 看一下继承关系&#xff1a; ava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.support.v7.widget.RecyclerViewKnown Direct …

Android下点亮LED

http://blog.csdn.net/cpj_phone/article/details/43562551转载于:https://www.cnblogs.com/Ph-one/p/4276974.html

SEH处理异常

Win32为每个线程定义了一个线程信息块,其中保存了线程的一些属性数据,线程信息块的属性被定义为NT_TIB结构 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberDa…

Asp.net MVC 4新项目中创建area的后续操作

Asp.net MVC 4新项目中创建area后&#xff0c;往往HomeController与area的HomeController路由发生混淆&#xff0c;需要手工设置一些地方避免mvc无法识别默认路由的状况。 无废话具体步骤&#xff1a; 1. 检查早Global.asax和\App_Start\RouteConfig.cs中是否已经自动添加了Are…

55-混沌操作法之我见:一、逆势操作.(2015.2.7)

混沌操作法之我见&#xff1a;一、逆势操作 首先谈谈&#xff0c;均线以及鳄鱼线。单独的市场价格表达了t时刻价格的个体情况&#xff0c;均线表达了一段时间内价格的综合情况。t时刻的价格与均线的比较&#xff0c;表达了考虑了过去以及当前综合价格的比较情况&#xff0c;即t…

SEH链和展开操作

每次我们定义了一个新的SEH异常处理回调函数,EXCEPTION_REGISTRATION结构的prev字段都被要求填写上一个EXCEPTION_REGISTRATION结构的地址,随着应用程序对模块的调用一层层深入下去的时候,那么最后回调函数会形成一个SEH链 当程序中有多个线程在运行的时候,每个线程中都会存在各…

spring的基本知识

首先是回顾一下spring的基本知识 1、controller 控制器&#xff08;注入服务&#xff09; 2、service 服务&#xff08;注入dao&#xff09; 3、repository dao&#xff08;实现dao访问&#xff09; 4、component &#xff08;把普通pojo实例化到spring容器中&#xff0c;相当于…

vs2010 EF4.0 访问mysql

需要安装mysql-connector-net-6.3.5 6.8.9的安装完后在dbfirst里找不到对应的提供程序 链接字符串里需要 指定下编码(如果不是gbk的话) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 变长参数的理解

C语言里面 提供了一些宏 可以使用变长参数 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判断一个div的边界是否超出另外一个div的边界

摘要&#xff1a;本文简单介绍jquery判断一个div的边界是否超出另外一个div的边界&#xff0c;如果超出边界做出相应的处理。 1、实现效果 判断前 判断后 2、实现思路 实现类似的判断&#xff0c;主要是获取两个div在浏览器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式数据

//数据定义&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一条json数据&#xff1a;令str为[{"name":"21001","password":"21001"}] User usernew User()…

进程的细节

从今天开始,重新学习一些细节性质的东西 一.在VS开发环境中,应用程序的入口点: _tWinMain WinMainCRTStartup _tWinMain wWinMainCRTStartup _tmain mainCRTStartup _tmain wmainCRTStartup 相关的介…

maven环境快速搭建(转)

最近&#xff0c;开发中要用到maven&#xff0c;所以对maven进行了简单的学习。因为有个maven高手在身边&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我这里算是自我总结吧。关于maven是什么东东&#xff0c;请参考其它文章。 ----------------准备工作-------------…

cocos2d-x3.0 相对布局(一)

2dx相对布局和Android非常类似。假设前完成Android它应该是easy入门。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

管理员以标准权限运行时

在XP时代,大多数用户都用一个管理员(administrator)帐号来登录Windows 利用这个账户,用户几乎能没有任何限制的访问重要的系统资源,因为该账户被授予了很高的权限,一旦用这个帐号登录了xp以及xp之前的操作系统,Windows操作系统就会创建一个安全令牌(security token).每当有代码…

HDU 4791 amp; ZOJ 3726 Alice#39;s Print Service (数学 打表)

题目链接&#xff1a; HDU:http://acm.hdu.edu.cn/showproblem.php?pid4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId5072 Problem DescriptionAlice is providing print service, while the pricing doesnt seem to be reasonable, so people using…

夺命雷公狗---ECSHOP---08---商品页的拇改成星星

<strong>用户评价&#xff1a;</strong>{*---------商品评价星星开始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品评价星星结束-------*} 这里主要是要有星…

文件指针

一.移动文件指针 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移动的模式 FILE_BEGIN 不管文件处于什么地方,总是从文件的头部开始移动,这时的位置参数相当于指定了一个绝对位置 FILE_CURRENT 从当前的文件指针处开始移…

见证下的自我变化-2014全年总结

又是一年总结季&#xff0c;回过头看看看自己的成长&#xff0c;心里真的是满满的喜悦之情…… 一年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux学习篇】This virtual machine is configured for 64-bit guest operating systems.……

在学习Linux的基本操作的时候&#xff0c;安装虚拟环境则提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各种拒绝的心理&#xff0c;所以屏蔽了这个错误&#xff0c;但是屏蔽永远也解决不了问题的&#xff0c;所以自己则尝试百度…