SEH結構化異常處理03

2022-04-19 04:19:29 字數 3606 閱讀 3500

執行緒上的異常處理:

異常處理函式原型:

返回值有兩種: exceptioncontinueexecution異常已解決,

exceptioncontinuesearch此seh未解決問題,繼續在seh鏈中搜尋

exception_disposition __cdecl_except_handler (

_in_

struct _exception_record *_exceptionrecord, //異常記錄結構指標

_in_ void * _establisherframe,            //指向exception_registration結構,即seh鏈

_inout_ struct _context *_contextrecord,      //context結構指標

_inout_ void * _dispatchercontext          //無意義

);

註冊**函式的標準動作:

push    offset sehhandler                ;

建立seh鏈標準動作

push

fs:[0

]

movfs:[0],esp ;

建立exception_registration_record結構並將

;tib偏移0改為該結構位址

err結構兩個字段:

prev

//指向上乙個seh的err結構

handle //

指向本handler(處理程式)

關於指向,指標的問題在這裡又產生了一定的困擾。思路理清了後總結如下:指標就是儲存了乙個位址的變數,對指標*運算,即[ptr]的同時完成了指向的動作。[fs:0]指向err結構 的理解就是,記憶體位址fs:0處儲存的是err結構位址,那麼[fs:0](對fs:0取位址)當然就是指向err結構。

關於指向xx結構,即指向此結構的第乙個字段,也就是說[fs:0]就是prev的內容。

_except_handler引數一:

typedef struct

_exception_record exception_record;

_except_handler引數二:
1

;******************************************2;

coded by rrouned3;

******************************************4;

例子2.thread型異常處理5;

******************************************

6 .386

7.model flat,stdcall

8 option casemap:

none

910 include windows.inc

11 include user32.inc

12includelib user32.lib

13 include kernel32.inc

14includelib kernel32.lib

1516

.data

17 sztit db "

seh例子

",018 messuc db "

修復了除0異常

",019

.data?

20hinstance dd ?21;

;-----------------------------------------

22.code

23sehhandler proc c uses ebx esi edi pexcept,pframe,pcontext,pdispatch

2425 assume esi:

ptr exception_record

26 assume edi:

ptr context

2728

movesi,pexcept

29mov

edi,pcontext

30test [esi].exceptionflags,3

31jne

_continue_search

32cmp [esi].exceptioncode,status_integer_divide_by_zero ;

是除0錯?

33jne

_continue_search

3435

mov [edi].regecx,10

;將被除數改為非0值繼續返回執行36;

這次可以得到正確結果是10

3738

mov eax,exceptioncontinueexecution ;

修復完畢,繼續執行

39ret

40_continue_search:

41mov eax,exceptioncontinuesearch ;

其他異常,無法處理,繼續遍歷seh**函式列表

42ret

43sehhandler endp

44_start:

45 assume fs:

nothing

4647

push offset sehhandler ;

建立seh鏈標準動作

48push

fs:[0]49

movfs:[0],esp ;

建立exception_registration_record結構並將50;

tib偏移0改為該結構位址51;

引發異常

52xor ecx,ecx ;

ecx=0

53mov eax,100

;eax=100

54xor edx,edx ;

edx=0

5556

div ecx ;

產生除0錯!

57 invoke messagebox,0,addr messuc,addr sztit,0

5859

popfs:[0] ;

恢復原異常**函式

60add esp,4

;平衡堆疊

6162 invoke exitprocess,0

63 end _start

C 異常與結構化異常SEH的比較

結構化異常處理seh 全稱structured exception handling 是windows作業系統所提供的對錯誤或異常的處理機制,是windows作業系統的乙個重要組成部分。q 在windows系統中,我們在開發應用程式時應該使用結構化異常還是c 異常?a seh是作業系統所提供的便利,...

Try Catch結構化異常處理

try.catch.會損耗一定的效能,但不會造成效能瓶頸。建議使用try.catch。盡可能的考慮到可能存在的異常並進行處理,盡可能的少出現異常或不出現異常。不要濫用資料庫事務提高效能,這樣可能會造成併發訪問的效能問題或效能瓶頸。不要使用try.catch進行流程處理。如果可能的話,盡量要把迴圈寫在...

結構化異常

try,catch,finally catch中的 是對異常的恢復操作。比如有狀態的恢復,回滾。finally是做一些清理工作。foreach,using,lock實際上就是轉換成try finally這種結構 finally中就是物件的清理,foreach是對inumerator.dispose ...