Piotr Caban : ntdll: Add RtlRestoreContext implementation.

Alexandre Julliard julliard at winehq.org
Wed Jul 6 09:57:30 CDT 2016


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Jul  5 16:24:33 2016 +0200

ntdll: Add RtlRestoreContext implementation.

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

---

 dlls/kernel32/kernel32.spec |  2 +-
 dlls/ntdll/ntdll.spec       |  1 +
 dlls/ntdll/signal_x86_64.c  | 72 ++++++++++++++++++++++++---------------------
 3 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 0fc4dcb..3874b3e 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1293,7 +1293,7 @@
 @ stdcall RtlMoveMemory(ptr ptr long) ntdll.RtlMoveMemory
 @ stdcall -arch=x86_64,arm RtlPcToFileHeader(ptr ptr) ntdll.RtlPcToFileHeader
 @ stdcall -arch=arm -register RtlRaiseException(ptr) ntdll.RtlRaiseException
-# @ stub -arch=x86_64 RtlRestoreContext
+@ stdcall -arch=x86_64 RtlRestoreContext(ptr ptr) ntdll.RtlRestoreContext
 @ stdcall RtlUnwind(ptr ptr ptr long) ntdll.RtlUnwind
 @ stdcall -arch=x86_64 RtlUnwindEx(long long ptr long ptr) ntdll.RtlUnwindEx
 @ stdcall -arch=x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr) ntdll.RtlVirtualUnwind
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 4737b06..34b4b4a 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -838,6 +838,7 @@
 @ stdcall RtlRemoveVectoredContinueHandler(ptr)
 @ stdcall RtlRemoveVectoredExceptionHandler(ptr)
 @ stub RtlResetRtlTranslations
+@ stdcall -arch=x86_64 RtlRestoreContext(ptr ptr)
 @ stdcall RtlRestoreLastWin32Error(long) RtlSetLastWin32Error
 @ stub RtlRevertMemoryStream
 @ stub RtlRunDecodeUnicodeString
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index ca3e6ca..1db3a23 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3437,6 +3437,44 @@ __ASM_GLOBAL_FUNC( call_consolidate_callback,
                    __ASM_CFI(".cfi_same_value %rbp\n\t")
                    "ret")
 
+/*******************************************************************
+ *              RtlRestoreContext (NTDLL.@)
+ */
+void WINAPI RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
+{
+    if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
+    {
+        struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
+        context->Rbx       = jmp->Rbx;
+        context->Rsp       = jmp->Rsp;
+        context->Rbp       = jmp->Rbp;
+        context->Rsi       = jmp->Rsi;
+        context->Rdi       = jmp->Rdi;
+        context->R12       = jmp->R12;
+        context->R13       = jmp->R13;
+        context->R14       = jmp->R14;
+        context->R15       = jmp->R15;
+        context->u.s.Xmm6  = jmp->Xmm6;
+        context->u.s.Xmm7  = jmp->Xmm7;
+        context->u.s.Xmm8  = jmp->Xmm8;
+        context->u.s.Xmm9  = jmp->Xmm9;
+        context->u.s.Xmm10 = jmp->Xmm10;
+        context->u.s.Xmm11 = jmp->Xmm11;
+        context->u.s.Xmm12 = jmp->Xmm12;
+        context->u.s.Xmm13 = jmp->Xmm13;
+        context->u.s.Xmm14 = jmp->Xmm14;
+        context->u.s.Xmm15 = jmp->Xmm15;
+    }
+    else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1)
+    {
+        PVOID (CALLBACK *consolidate)(EXCEPTION_RECORD *) = (void *)rec->ExceptionInformation[0];
+        TRACE( "calling consolidate callback %p (rec=%p)\n", consolidate, rec );
+        context->Rip = (ULONG64)call_consolidate_callback( context, consolidate, rec );
+    }
+    TRACE( "returning to %lx stack %lx\n", context->Rip, context->Rsp );
+    set_cpu_context( context );
+}
+
 
 /*******************************************************************
  *		RtlUnwindEx (NTDLL.@)
@@ -3597,41 +3635,9 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
         *context = new_context;
     }
 
-    if (rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
-    {
-        struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
-        context->Rbx       = jmp->Rbx;
-        context->Rsp       = jmp->Rsp;
-        context->Rbp       = jmp->Rbp;
-        context->Rsi       = jmp->Rsi;
-        context->Rdi       = jmp->Rdi;
-        context->R12       = jmp->R12;
-        context->R13       = jmp->R13;
-        context->R14       = jmp->R14;
-        context->R15       = jmp->R15;
-        context->Rip       = jmp->Rip;
-        context->u.s.Xmm6  = jmp->Xmm6;
-        context->u.s.Xmm7  = jmp->Xmm7;
-        context->u.s.Xmm8  = jmp->Xmm8;
-        context->u.s.Xmm9  = jmp->Xmm9;
-        context->u.s.Xmm10 = jmp->Xmm10;
-        context->u.s.Xmm11 = jmp->Xmm11;
-        context->u.s.Xmm12 = jmp->Xmm12;
-        context->u.s.Xmm13 = jmp->Xmm13;
-        context->u.s.Xmm14 = jmp->Xmm14;
-        context->u.s.Xmm15 = jmp->Xmm15;
-    }
-    else if (rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1)
-    {
-        PVOID (CALLBACK *consolidate)(EXCEPTION_RECORD *) = (void *)rec->ExceptionInformation[0];
-        TRACE( "calling consolidate callback %p (rec=%p)\n", consolidate, rec );
-        target_ip = call_consolidate_callback( context, consolidate, rec );
-        TRACE( "-> target=%p\n", target_ip );
-    }
     context->Rax = (ULONG64)retval;
     context->Rip = (ULONG64)target_ip;
-    TRACE( "returning to %lx stack %lx\n", context->Rip, context->Rsp );
-    set_cpu_context( context );
+    RtlRestoreContext(context, rec);
 }
 
 




More information about the wine-cvs mailing list