Alexandre Julliard : ntdll: Set the exception address to the program counter in RtlRaiseException.

Alexandre Julliard julliard at winehq.org
Fri Apr 10 08:10:15 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Apr 10 13:17:12 2009 +0200

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 53e0012..b36b51e 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 518b123..f37fb71 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 0f4808e..87da976 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 3deb583..9679c2c 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 8972b69..22c4b0d 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);




More information about the wine-cvs mailing list