Author: pschweitzer Date: Sun Aug 31 16:58:44 2008 New Revision: 35846
URL: http://svn.reactos.org/svn/reactos?rev=35846&view=rev Log: Reverted r35812 because of unwanted triple fault bug. See issue #3704,3706 for more details.
Modified: trunk/reactos/dll/ntdll/dispatch/ (props changed) 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
Propchange: trunk/reactos/dll/ntdll/dispatch/ ------------------------------------------------------------------------------ (empty)
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] Sun Aug 31 16:58:44 2008 @@ -15,6 +15,10 @@
typedef NTSTATUS (NTAPI *USER_CALL)(PVOID Argument, ULONG ArgumentLength);
+EXCEPTION_DISPOSITION NTAPI +RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context); + /* FUNCTIONS ****************************************************************/
/* @@ -28,16 +32,26 @@ EXCEPTION_RECORD NestedExceptionRecord; NTSTATUS Status;
- /* Dispatch the exception and check the result */ - if (RtlDispatchException(ExceptionRecord, Context)) + /* call the vectored exception handlers */ + if(RtlpExecuteVectoredExceptionHandlers(ExceptionRecord, + Context) != ExceptionContinueExecution) { - /* Continue executing */ - Status = NtContinue(Context, FALSE); + goto ContinueExecution; } else { - /* Raise an exception */ - Status = NtRaiseException(ExceptionRecord, Context, FALSE); + /* 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); + } }
/* 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] Sun Aug 31 16:58:44 2008 @@ -183,13 +183,43 @@ .globl _KiUserExceptionDispatcher@8 _KiUserExceptionDispatcher@8:
- /* Clear direction flag */ + /* 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. + */ + 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 @@ -198,6 +228,7 @@ 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] Sun Aug 31 16:58:44 2008 @@ -73,13 +73,6 @@ EXCEPTION_DISPOSITION Disposition; 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);
Modified: trunk/reactos/lib/rtl/rtlp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/rtlp.h?rev=35846&am... ============================================================================== --- trunk/reactos/lib/rtl/rtlp.h [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/rtlp.h [iso-8859-1] Sun Aug 31 16:58:44 2008 @@ -36,13 +36,6 @@ 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=3584... ============================================================================== --- trunk/reactos/lib/rtl/vectoreh.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/vectoreh.c [iso-8859-1] Sun Aug 31 16:58:44 2008 @@ -28,10 +28,9 @@
/* FUNCTIONS ***************************************************************/
-BOOLEAN -NTAPI -RtlCallVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) +EXCEPTION_DISPOSITION NTAPI +RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context) { PLIST_ENTRY CurrentEntry; PRTL_VECTORED_EXCEPTION_HANDLER veh; @@ -56,7 +55,7 @@
if(VectoredHandler(&ExceptionInfo) == EXCEPTION_CONTINUE_EXECUTION) { - return TRUE; + return ExceptionContinueSearch; }
RtlEnterCriticalSection(&RtlpVectoredExceptionLock); @@ -64,7 +63,7 @@ RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); }
- return FALSE; + return ExceptionContinueExecution; }
VOID