diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index d76fe95..4327859 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -656,6 +656,13 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
 
     frame = NtCurrentTeb()->Tib.ExceptionList;
     nested_frame = NULL;
+    if (rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
+    {
+        while(frame != (EXCEPTION_REGISTRATION_RECORD*)~0UL &&
+              frame->Prev != (EXCEPTION_REGISTRATION_RECORD*)~0UL)
+          frame = frame->Prev;
+    }
+
     while (frame != (EXCEPTION_REGISTRATION_RECORD*)~0UL)
     {
         /* Check frame address */
@@ -743,8 +750,11 @@ static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL f
         /* fix up instruction pointer in context for EXCEPTION_BREAKPOINT */
         if (rec->ExceptionCode == EXCEPTION_BREAKPOINT) context->Eip--;
 
-        if (call_vectored_handlers( rec, context ) == EXCEPTION_CONTINUE_EXECUTION)
-            return STATUS_SUCCESS;
+        if (rec->ExceptionCode != EXCEPTION_ACCESS_VIOLATION)
+        {
+          if (call_vectored_handlers( rec, context ) == EXCEPTION_CONTINUE_EXECUTION)
+              return STATUS_SUCCESS;
+        }
 
         if ((status = call_stack_handlers( rec, context )) != STATUS_UNHANDLED_EXCEPTION)
             return status;
