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/dispatc…
==============================================================================
--- 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/di…
==============================================================================
--- 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=…
==============================================================================
--- 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&a…
==============================================================================
--- 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=358…
==============================================================================
--- 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