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