From 6a1494dd6fe1e9941664c469f6978d25cedca6b9 Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Tue, 2 Aug 2016 23:52:12 -0700 Subject: [PATCH] ntdll: Call __finally blocks in __C_specific_handler Signed-off-by: Daniel Lehman --- dlls/ntdll/signal_x86_64.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 009505f..2419e5e 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -3728,13 +3728,39 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, struct _DISPATCHER_CONTEXT *dispatch ) { SCOPE_TABLE *table = dispatch->HandlerData; + PC_LANGUAGE_EXCEPTION_HANDLER handler; + EXCEPTION_POINTERS ptrs; ULONG i; TRACE( "%p %lx %p %p\n", rec, frame, context, dispatch ); if (TRACE_ON(seh)) dump_scope_table( dispatch->ImageBase, table ); - if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) /* FIXME */ + if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) + { + for (i = 0; i < table->Count; i++) + { + if (context->Rip >= dispatch->ImageBase + table->ScopeRecord[i].BeginAddress && + context->Rip < dispatch->ImageBase + table->ScopeRecord[i].EndAddress) + { + if (table->ScopeRecord[i].JumpTarget) continue; + + if (rec->ExceptionFlags & EH_TARGET_UNWIND && + dispatch->TargetIp >= dispatch->ImageBase + table->ScopeRecord[i].BeginAddress && + dispatch->TargetIp < dispatch->ImageBase + table->ScopeRecord[i].EndAddress) + { + break; + } + + handler = (PC_LANGUAGE_EXCEPTION_HANDLER)(dispatch->ImageBase + table->ScopeRecord[i].HandlerAddress); + ptrs.ExceptionRecord = rec; + ptrs.ContextRecord = context; + + TRACE( "calling __finally %p ptrs %p frame %lx\n", handler, &ptrs, frame ); + handler( &ptrs, frame ); + } + } return ExceptionContinueSearch; + } for (i = 0; i < table->Count; i++) { @@ -3744,7 +3770,6 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, if (!table->ScopeRecord[i].JumpTarget) continue; if (table->ScopeRecord[i].HandlerAddress != EXCEPTION_EXECUTE_HANDLER) { - EXCEPTION_POINTERS ptrs; PC_LANGUAGE_EXCEPTION_HANDLER filter; filter = (PC_LANGUAGE_EXCEPTION_HANDLER)(dispatch->ImageBase + table->ScopeRecord[i].HandlerAddress); -- 1.9.5