_try_finally原理
无论try
结构体中是什么代码,都会执行finally
里面的代码
局部展开
当try
里面没有异常,而是return
、continue
、break
等语句时,就不会走_except_handle3
这个函数,而是调用_local_unwind2
进行展开
然后调用[ebx + esi*4 + 8]
跟进去就到了finally
语句块的地方
我们探究一下实现的原理,这里本来应该是lpfnFilter
参数,指向异常处理过滤的代码的地址,但是这里是0。只要这个地方的地址为0就是finally
语句块
__global_unwind2
函数最终会调用一个RtlUnwind
函数,该函数内容比较杂乱,其大体流程如下
全局展开
全局展开就是一层一层的向上找异常处理函数,finally
模块还是照常执行