Daniel Lehman : ntdll: Call __finally blocks in __C_specific_handler.

Alexandre Julliard julliard at winehq.org
Wed Aug 10 11:05:57 CDT 2016


Module: wine
Branch: master
Commit: 0b6e5fae743a8fa096b8ad898ccace9de0776702
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0b6e5fae743a8fa096b8ad898ccace9de0776702

Author: Daniel Lehman <dlehman at esri.com>
Date:   Tue Aug  2 23:52:12 2016 -0700

ntdll: Call __finally blocks in __C_specific_handler.

Signed-off-by: Daniel Lehman <dlehman at esri.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_x86_64.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 009505f..4c88536 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -81,6 +81,7 @@ typedef EXCEPTION_DISPOSITION (WINAPI *PEXCEPTION_ROUTINE)( EXCEPTION_RECORD *re
                                                             ULONG64 frame,
                                                             CONTEXT *context,
                                                             struct _DISPATCHER_CONTEXT *dispatch );
+typedef void (WINAPI *TERMINATION_HANDLER)( ULONG flags, ULONG64 frame );
 
 typedef struct _DISPATCHER_CONTEXT
 {
@@ -3733,8 +3734,32 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec,
     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)
+            {
+                TERMINATION_HANDLER handler;
+
+                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 = (TERMINATION_HANDLER)(dispatch->ImageBase + table->ScopeRecord[i].HandlerAddress);
+
+                TRACE( "calling __finally %p frame %lx\n", handler, frame );
+                handler( 1, frame );
+            }
+        }
         return ExceptionContinueSearch;
+    }
 
     for (i = 0; i < table->Count; i++)
     {




More information about the wine-cvs mailing list