From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/signal_x86_64.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index ae658910868..5ce30461457 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -614,20 +614,25 @@ NTSTATUS WINAPI dispatch_wow_exception( EXCEPTION_RECORD *rec_ptr, CONTEXT *cont }
+__ASM_GLOBAL_FUNC( dispatch_wow_exception_thunk, + "movw %cs,%ax\n\t" + "cmpw %ax,0x38(%rdx)\n\t" /* context->SegCs */ + "je 1f\n\t" + "movq %r14,%rsp\n\t" /* switch to 64-bit stack */ + "call " __ASM_NAME("dispatch_wow_exception") "\n\t" + "int3\n\t" + "1:\tret") + + /******************************************************************* * KiUserExceptionDispatcher (NTDLL.@) */ __ASM_GLOBAL_FUNC( KiUserExceptionDispatcher, - "mov 0x98(%rsp),%rcx\n\t" /* context->Rsp */ - "movw %cs,%ax\n\t" - "cmpw %ax,0x38(%rsp)\n\t" /* context->SegCs */ - "je 1f\n\t" "mov %rsp,%rdx\n\t" /* context */ "lea 0x4f0(%rsp),%rcx\n\t" /* rec */ - "movq %r14,%rsp\n\t" /* switch to 64-bit stack */ - "call " __ASM_NAME("dispatch_wow_exception") "\n\t" - "int3\n" - "1:\tmov 0xf8(%rsp),%rdx\n\t" /* context->Rip */ + "call " __ASM_NAME("dispatch_wow_exception_thunk") "\n\t" + "mov 0x98(%rsp),%rcx\n\t" /* context->Rsp */ + "mov 0xf8(%rsp),%rdx\n\t" /* context->Rip */ "mov %rdx,-0x8(%rcx)\n\t" "mov %rbp,-0x10(%rcx)\n\t" "mov %rdi,-0x18(%rcx)\n\t"