能力值:
(RANK:260 )
|
-
-
2 楼
SEH的机制,是一个SEH记录的链表,每个记录都有一个异常处理函数指针,链表的头由FS:[0]指示。
当发生异常时,操作系统将会顺着SEH链表,依次调用其中的异常处理函数,如果异常处理函数返回EXCEPTION_CONTINUE_EXECUTION,系统认为异常已经被处理过了,系统会重新调度发生异常的线程开始运行;如果一个异常处理函数返回EXCEPTION_CONTINUE_SEARCH,系统认为这个函数没有处理异常,它就取出链表中下一个记录,并重复上面的过程,直到有一个异常处理函数处理过了所发生的异常(重新调试线程运行),或者直到所有的异常处理函数都被调用过了(则调用UnhandledExceptionFilter)
要理解f9与shift+f9的区别,你需要了解ring3调试器的原理。
ring3调试器的本质就是被调试进程的异常发生时,调试器会获得两次处理异常的机会,一次叫FirstChance,另一次叫LastChance。FirstChance是在进程自身的异常处理函数被调用之前,而LastChance是在进程自身所有的SEH处理程序之后。
也就是说调试器本质上相当于在正常的SEH链表的头和尾各插入一个节点。
F9表示异常已经被处理了,也就是用DBG_CONTINUE 为参数调用ContinueDebugEvent()了,相当于SEH处理程序返回EXCEPTION_CONTINUE_EXECUTION;相反Shift+F9则是用DBG_EXCEPTION_NOT_HANDLED来调用ContinueDebugEvent()了,相当于EXCEPTION_CONTINUE_SEARCH。
|
|
|