Author: sginsberg Date: Sat Nov 1 14:48:52 2008 New Revision: 37137
URL: http://svn.reactos.org/svn/reactos?rev=37137&view=rev Log: - Reapply 35812: - RtlDispatchException: Call vectored exception handlers before doing anything else - KiUserExceptionDispatcher: Call RtlDispatchException directly as it now takes care of vectored handling - Rename RtlpExecuteVectoredExceptionHandlers to RtlCallVectoredExceptionHandlers, and fix return type - References: "New Vectored Exception Handling in Windows XP" by Matt Pietrek - New in this revision: Only call vectored handlers in user mode, as there is no such thing in kernel mode
Modified: trunk/reactos/dll/ntdll/dispatch/dispatch.c trunk/reactos/dll/ntdll/dispatch/i386/dispatch.S trunk/reactos/lib/rtl/i386/except.c trunk/reactos/lib/rtl/rtlp.h trunk/reactos/lib/rtl/vectoreh.c
Modified: trunk/reactos/dll/ntdll/dispatch/dispatch.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/dispatch/dispatch... ============================================================================== --- trunk/reactos/dll/ntdll/dispatch/dispatch.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/dispatch/dispatch.c [iso-8859-1] Sat Nov 1 14:48:52 2008 @@ -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 @@ 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 */
Modified: trunk/reactos/dll/ntdll/dispatch/i386/dispatch.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/dispatch/i386/dis... ============================================================================== --- trunk/reactos/dll/ntdll/dispatch/i386/dispatch.S [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/dispatch/i386/dispatch.S [iso-8859-1] Sat Nov 1 14:48:52 2008 @@ -183,52 +183,22 @@ .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 */ + /* Dispatch the exception */ push ecx push ebx - call _RtlpExecuteVectoredExceptionHandlers@8 - - /* Check for success */ - or al, al - jnz ContinueExecution - - /* Dispatch the exception */ - sub esp, 8 call _RtlDispatchException@8
/* Check for success */ or al, al jz RaiseException
-ContinueExecution: /* Pop off the records */ pop ebx pop ecx
Modified: trunk/reactos/lib/rtl/i386/except.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/i386/except.c?rev=3... ============================================================================== --- trunk/reactos/lib/rtl/i386/except.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/i386/except.c [iso-8859-1] Sat Nov 1 14:48:52 2008 @@ -73,6 +73,17 @@ EXCEPTION_DISPOSITION Disposition; ULONG_PTR StackLow, StackHigh; ULONG_PTR RegistrationFrameEnd; + + /* Perform vectored exception handling if we are in user mode */ + if (RtlpGetMode() != KernelMode) + { + /* 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);
Modified: trunk/reactos/lib/rtl/rtlp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/rtlp.h?rev=37137&am... ============================================================================== --- trunk/reactos/lib/rtl/rtlp.h [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/rtlp.h [iso-8859-1] Sat Nov 1 14:48:52 2008 @@ -36,6 +36,13 @@ VOID NTAPI RtlpSetExceptionList(PEXCEPTION_REGISTRATION_RECORD NewExceptionList); + +BOOLEAN +NTAPI +RtlCallVectoredExceptionHandlers( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context +);
typedef struct _DISPATCHER_CONTEXT {
Modified: trunk/reactos/lib/rtl/vectoreh.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/vectoreh.c?rev=3713... ============================================================================== --- trunk/reactos/lib/rtl/vectoreh.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/vectoreh.c [iso-8859-1] Sat Nov 1 14:48:52 2008 @@ -28,9 +28,10 @@
/* 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 @@
if(VectoredHandler(&ExceptionInfo) == EXCEPTION_CONTINUE_EXECUTION) { - return ExceptionContinueSearch; + return TRUE; }
RtlEnterCriticalSection(&RtlpVectoredExceptionLock); @@ -63,7 +64,7 @@ RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); }
- return ExceptionContinueExecution; + return FALSE; }
VOID