From 7f9750550a8cefb4b057e0420c32204f887a4f1c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 10 Apr 2009 13:17:12 +0200 Subject: [PATCH] ntdll: Set the exception address to the program counter in RtlRaiseException. --- dlls/ntdll/signal_i386.c | 5 ++++- dlls/ntdll/signal_powerpc.c | 1 + dlls/ntdll/signal_sparc.c | 1 + dlls/ntdll/signal_x86_64.c | 5 ++++- dlls/ntdll/tests/exception.c | 5 ++--- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 53e001286c0..b36b51ebe80 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -2013,7 +2013,10 @@ void __wine_enter_vm86( CONTEXT *context ) */ void WINAPI __regs_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) { - NTSTATUS status = raise_exception( rec, context, TRUE ); + NTSTATUS status; + + rec->ExceptionAddress = (void *)context->Eip; + status = raise_exception( rec, context, TRUE ); if (status != STATUS_SUCCESS) raise_status( status, rec ); } DEFINE_REGS_ENTRYPOINT( RtlRaiseException, 1 ) diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c index 518b1238ac7..f37fb7156c8 100644 --- a/dlls/ntdll/signal_powerpc.c +++ b/dlls/ntdll/signal_powerpc.c @@ -1010,6 +1010,7 @@ void WINAPI RtlRaiseException( EXCEPTION_RECORD *rec ) NTSTATUS status; RtlCaptureContext( &context ); + rec->ExceptionAddress = (void *)context.Iar; status = raise_exception( rec, &context, TRUE ); if (status) raise_status( status, rec ); } diff --git a/dlls/ntdll/signal_sparc.c b/dlls/ntdll/signal_sparc.c index 0f4808e641f..87da976dbec 100644 --- a/dlls/ntdll/signal_sparc.c +++ b/dlls/ntdll/signal_sparc.c @@ -724,6 +724,7 @@ void WINAPI RtlRaiseException( EXCEPTION_RECORD *rec ) NTSTATUS status; RtlCaptureContext( &context ); + rec->ExceptionAddress = (void *)context.pc; status = raise_exception( rec, &context, TRUE ); if (status) raise_status( status, rec ); } diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 3deb583def0..9679c2c7d60 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -809,7 +809,10 @@ PVOID WINAPI RtlVirtualUnwind ( ULONG type, ULONG64 base, ULONG64 pc, */ void WINAPI __regs_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) { - NTSTATUS status = raise_exception( rec, context, TRUE ); + NTSTATUS status; + + rec->ExceptionAddress = (void *)context->Rip; + status = raise_exception( rec, context, TRUE ); if (status != STATUS_SUCCESS) raise_status( status, rec ); } DEFINE_REGS_ENTRYPOINT( RtlRaiseException, 1 ) diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index 8972b692e80..22c4b0d296d 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -206,7 +206,6 @@ static LONG CALLBACK rtlraiseexception_vectored_handler(EXCEPTION_POINTERS *Exce trace("vect. handler %08x addr:%p context.Eip:%x\n", rec->ExceptionCode, rec->ExceptionAddress, context->Eip); - todo_wine ok(rec->ExceptionAddress == (char *)code_mem + 0xb, "ExceptionAddress at %p instead of %p\n", rec->ExceptionAddress, (char *)code_mem + 0xb); @@ -241,10 +240,8 @@ static DWORD rtlraiseexception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTR trace( "exception: %08x flags:%x addr:%p context: Eip:%x\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, context->Eip ); - todo_wine { ok(rec->ExceptionAddress == (char *)code_mem + 0xb, "ExceptionAddress at %p instead of %p\n", rec->ExceptionAddress, (char *)code_mem + 0xb); - } /* check that context.Eip is fixed up only for EXCEPTION_BREAKPOINT * even if raised by RtlRaiseException @@ -319,6 +316,8 @@ static void run_rtlraiseexception_test(DWORD exceptioncode) } func(pRtlRaiseException, &record); + ok( record.ExceptionAddress == (char *)code_mem + 0x0b, + "address set to %p instead of %p\n", record.ExceptionAddress, (char *)code_mem + 0x0b ); if (have_vectored_api) pRtlRemoveVectoredExceptionHandler(vectored_handler); -- 2.11.4.GIT