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.pswp.cn/news/375313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375313.shtml
英文地址,請注明出處:http://en.pswp.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;所以自己則嘗試百度…