Alexandre Julliard : ntdll: Send first chance debug event while on signal stack on i386.
Alexandre Julliard
julliard at winehq.org
Wed Sep 18 16:11:08 CDT 2019
Module: wine
Branch: master
Commit: 7ee66b29cb52fd3fc18fe2314c720b3a0e348e43
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7ee66b29cb52fd3fc18fe2314c720b3a0e348e43
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 18 18:09:11 2019 +0200
ntdll: Send first chance debug event while on signal stack on i386.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/signal_i386.c | 37 ++++++++++++++++++++++---------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index f15b327624..534b05c717 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -724,18 +724,14 @@ static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL f
context->Ebp, context->Esp, context->SegCs, context->SegDs,
context->SegEs, context->SegFs, context->SegGs, context->EFlags );
}
- status = send_debug_event( rec, TRUE, context );
- if (status == DBG_CONTINUE || status == DBG_EXCEPTION_HANDLED)
- return STATUS_SUCCESS;
/* 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 (call_vectored_handlers( rec, context ) == EXCEPTION_CONTINUE_EXECUTION) goto done;
- if ((status = call_stack_handlers( rec, context )) != STATUS_UNHANDLED_EXCEPTION)
- return status;
+ if ((status = call_stack_handlers( rec, context )) == STATUS_SUCCESS) goto done;
+ if (status != STATUS_UNHANDLED_EXCEPTION) return status;
}
/* last chance exception */
@@ -752,7 +748,8 @@ static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL f
rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress );
NtTerminateProcess( NtCurrentProcess(), rec->ExceptionCode );
}
- return STATUS_SUCCESS;
+done:
+ return NtSetContextThread( GetCurrentThread(), context );
}
@@ -1860,7 +1857,7 @@ static void WINAPI raise_generic_exception( EXCEPTION_RECORD *rec, CONTEXT *cont
{
NTSTATUS status;
- status = NtRaiseException( rec, context, TRUE );
+ status = raise_exception( rec, context, TRUE );
raise_status( status, rec );
}
@@ -1872,6 +1869,13 @@ static void WINAPI raise_generic_exception( EXCEPTION_RECORD *rec, CONTEXT *cont
*/
static void setup_raise_exception( ucontext_t *sigcontext, struct stack_layout *stack )
{
+ NTSTATUS status = send_debug_event( &stack->rec, TRUE, &stack->context );
+
+ if (status == DBG_CONTINUE || status == DBG_EXCEPTION_HANDLED)
+ {
+ restore_context( &stack->context, sigcontext );
+ return;
+ }
ESP_sig(sigcontext) = (DWORD)stack;
EIP_sig(sigcontext) = (DWORD)raise_generic_exception;
/* clear single-step, direction, and align check flag */
@@ -2499,9 +2503,13 @@ __ASM_STDCALL_FUNC( RtlUnwind, 16,
*/
NTSTATUS WINAPI NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance )
{
- NTSTATUS status = raise_exception( rec, context, first_chance );
- if (status == STATUS_SUCCESS) NtSetContextThread( GetCurrentThread(), context );
- return status;
+ if (first_chance)
+ {
+ NTSTATUS status = send_debug_event( rec, TRUE, context );
+ if (status == DBG_CONTINUE || status == DBG_EXCEPTION_HANDLED)
+ NtSetContextThread( GetCurrentThread(), context );
+ }
+ return raise_exception( rec, context, first_chance );
}
@@ -2510,7 +2518,7 @@ NTSTATUS WINAPI NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL
*
* Raise an exception with the full CPU context.
*/
-void raise_exception_full_context( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance )
+void raise_exception_full_context( EXCEPTION_RECORD *rec, CONTEXT *context )
{
save_fpu( context );
save_fpux( context );
@@ -2523,7 +2531,7 @@ void raise_exception_full_context( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL
context->Dr7 = x86_thread_data()->dr7;
context->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
- RtlRaiseStatus( NtRaiseException( rec, context, first_chance ));
+ RtlRaiseStatus( NtRaiseException( rec, context, TRUE ));
}
@@ -2545,7 +2553,6 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
"leal 12(%ebp),%eax\n\t"
"movl %eax,0xc4(%esp)\n\t" /* context->Esp */
"movl %esp,%eax\n\t"
- "pushl $1\n\t"
"pushl %eax\n\t"
"pushl %ecx\n\t"
"call " __ASM_NAME("raise_exception_full_context") "\n\t"
More information about the wine-cvs
mailing list