Alexandre Julliard : ntdll: Add support for longjmp in RtlUnwindEx.

Alexandre Julliard julliard at winehq.org
Tue Feb 1 12:25:00 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb  1 16:34:04 2011 +0100

ntdll: Add support for longjmp in RtlUnwindEx.

---

 dlls/ntdll/signal_x86_64.c |   52 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 86f5c93..0fc53c7 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -100,6 +100,33 @@ typedef struct _SCOPE_TABLE
 } SCOPE_TABLE, *PSCOPE_TABLE;
 
 
+/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */
+struct MSVCRT_JUMP_BUFFER
+{
+    ULONG64 Frame;
+    ULONG64 Rbx;
+    ULONG64 Rsp;
+    ULONG64 Rbp;
+    ULONG64 Rsi;
+    ULONG64 Rdi;
+    ULONG64 R12;
+    ULONG64 R13;
+    ULONG64 R14;
+    ULONG64 R15;
+    ULONG64 Rip;
+    ULONG64 Spare;
+    M128A   Xmm6;
+    M128A   Xmm7;
+    M128A   Xmm8;
+    M128A   Xmm9;
+    M128A   Xmm10;
+    M128A   Xmm11;
+    M128A   Xmm12;
+    M128A   Xmm13;
+    M128A   Xmm14;
+    M128A   Xmm15;
+};
+
 /***********************************************************************
  * signal context platform-specific definitions
  */
@@ -3008,6 +3035,31 @@ 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;
+    }
     context.Rax = (ULONG64)retval;
     context.Rip = (ULONG64)target_ip;
     TRACE( "returning to %lx stack %lx\n", context.Rip, context.Rsp );




More information about the wine-cvs mailing list