diff --git a/reactos/dll/ntdll/dispatch/dispatch.c b/reactos/dll/ntdll/dispatch/dispatch.c index 6fd4f70024f..c6f749c70bd 100644 --- a/reactos/dll/ntdll/dispatch/dispatch.c +++ b/reactos/dll/ntdll/dispatch/dispatch.c @@ -15,10 +15,6 @@ typedef NTSTATUS (NTAPI *USER_CALL)(PVOID Argument, ULONG ArgumentLength); -EXCEPTION_DISPOSITION NTAPI -RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context); - /* FUNCTIONS ****************************************************************/ /* @@ -32,26 +28,16 @@ KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord, EXCEPTION_RECORD NestedExceptionRecord; NTSTATUS Status; - /* call the vectored exception handlers */ - if(RtlpExecuteVectoredExceptionHandlers(ExceptionRecord, - Context) != ExceptionContinueExecution) + /* Dispatch the exception and check the result */ + if (RtlDispatchException(ExceptionRecord, Context)) { - goto ContinueExecution; + /* Continue executing */ + Status = NtContinue(Context, FALSE); } else { - /* Dispatch the exception and check the result */ - if(RtlDispatchException(ExceptionRecord, Context)) - { -ContinueExecution: - /* Continue executing */ - Status = NtContinue(Context, FALSE); - } - else - { - /* Raise an exception */ - Status = NtRaiseException(ExceptionRecord, Context, FALSE); - } + /* Raise an exception */ + Status = NtRaiseException(ExceptionRecord, Context, FALSE); } /* Setup the Exception record */ diff --git a/reactos/dll/ntdll/dispatch/i386/dispatch.S b/reactos/dll/ntdll/dispatch/i386/dispatch.S index 526e5b8f189..00a21f47b82 100644 --- a/reactos/dll/ntdll/dispatch/i386/dispatch.S +++ b/reactos/dll/ntdll/dispatch/i386/dispatch.S @@ -183,43 +183,13 @@ _KiRaiseUserExceptionDispatcher@0: .globl _KiUserExceptionDispatcher@8 _KiUserExceptionDispatcher@8: - /* clear the direct flag - * text from bug 2279 - * if it not clear it means that if an exception occurs while - * the direction flag is set (typically inside memmove), the - * exception handlers will be called with the direction flag still - * set. The Windows x86-32 and x86-64 ABI requires that the - * direction flag be Calling memset() with a compile-time constant - * size on both GCC and MSVC will result in inlining a "rep stosd" - * instruction. Because of the ABI, they will assume that the - * direction flag is clear and not emit a "cld" instruction. - * Using memset() in an exception handler therefore will - * corrupt memory if the exception occurred during a reverse copy - * such as a forward overlapping memmove(). - * - * For reliability and ease of debugging, please add "cld" to the beginning of - * KiUserExceptionDispatcher. Note that the same will be true of x86-64 whenever - * that happens. This does not affect continuing execution; the CONTEXT of the - * exception has the direction flag set and will be restored upon NtContinue. - * KiUserApcDispatcher and KiUserCallbackDispatcher need to be evaluated for this - * issue. - */ - + /* Clear direction flag */ cld /* Save the Context and Exception Records */ mov ecx, [esp+4] mov ebx, [esp] - /* Call the vectored exception handler */ - push ecx - push ebx - call _RtlpExecuteVectoredExceptionHandlers@8 - - /* Check for success */ - or al, al - jnz ContinueExecution - /* Dispatch the exception */ sub esp, 8 call _RtlDispatchException@8 @@ -228,7 +198,6 @@ _KiUserExceptionDispatcher@8: or al, al jz RaiseException -ContinueExecution: /* Pop off the records */ pop ebx pop ecx diff --git a/reactos/lib/rtl/i386/except.c b/reactos/lib/rtl/i386/except.c index dc56aed3ec0..087ab74fcb1 100644 --- a/reactos/lib/rtl/i386/except.c +++ b/reactos/lib/rtl/i386/except.c @@ -74,6 +74,13 @@ RtlDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, ULONG_PTR StackLow, StackHigh; ULONG_PTR RegistrationFrameEnd; + /* Call any registered vectored handlers */ + if (RtlCallVectoredExceptionHandlers(ExceptionRecord, Context)) + { + /* Exception handled, continue execution */ + return TRUE; + } + /* Get the current stack limits and registration frame */ RtlpGetStackLimits(&StackLow, &StackHigh); RegistrationFrame = RtlpGetExceptionList(); diff --git a/reactos/lib/rtl/rtlp.h b/reactos/lib/rtl/rtlp.h index 845f625cbee..4bfba098a83 100644 --- a/reactos/lib/rtl/rtlp.h +++ b/reactos/lib/rtl/rtlp.h @@ -37,6 +37,13 @@ VOID NTAPI RtlpSetExceptionList(PEXCEPTION_REGISTRATION_RECORD NewExceptionList); +BOOLEAN +NTAPI +RtlCallVectoredExceptionHandlers( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context +); + typedef struct _DISPATCHER_CONTEXT { PEXCEPTION_REGISTRATION_RECORD RegistrationPointer; diff --git a/reactos/lib/rtl/vectoreh.c b/reactos/lib/rtl/vectoreh.c index d1a39138622..52d6667cce6 100644 --- a/reactos/lib/rtl/vectoreh.c +++ b/reactos/lib/rtl/vectoreh.c @@ -28,9 +28,10 @@ typedef struct _RTL_VECTORED_EXCEPTION_HANDLER /* FUNCTIONS ***************************************************************/ -EXCEPTION_DISPOSITION NTAPI -RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) +BOOLEAN +NTAPI +RtlCallVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context) { PLIST_ENTRY CurrentEntry; PRTL_VECTORED_EXCEPTION_HANDLER veh; @@ -55,7 +56,7 @@ RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, if(VectoredHandler(&ExceptionInfo) == EXCEPTION_CONTINUE_EXECUTION) { - return ExceptionContinueSearch; + return TRUE; } RtlEnterCriticalSection(&RtlpVectoredExceptionLock); @@ -63,7 +64,7 @@ RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); } - return ExceptionContinueExecution; + return FALSE; } VOID