Fix RtlpGetStackLimits to get the right limits if called in kernel-mode
(separated implementations). Also don't return from _SEH_TRY blocks,
because PSEH doesn't support this. Also temporarly disable a
ProbeForRead check in KiContinue because it currently causes trouble
Modified: trunk/reactos/lib/ntdll/main/i386/dispatch.S
Modified: trunk/reactos/lib/rtl/i386/except.s
Modified: trunk/reactos/ntoskrnl/ke/exception.c
Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c
Modified: trunk/reactos/ntoskrnl/rtl/i386/seh.s
_____
Modified: trunk/reactos/lib/ntdll/main/i386/dispatch.S
--- trunk/reactos/lib/ntdll/main/i386/dispatch.S 2005-09-12
01:32:11 UTC (rev 17813)
+++ trunk/reactos/lib/ntdll/main/i386/dispatch.S 2005-09-12
02:57:47 UTC (rev 17814)
@@ -184,3 +184,19 @@
call _RtlRaiseException@4
ret 8
+.globl _RtlpGetStackLimits@8
+_RtlpGetStackLimits@8:
+
+ /* Get the stack limits */
+ mov eax, [fs:TEB_STACK_LIMIT]
+ mov ecx, [fs:TEB_STACK_BASE]
+
+ /* Return them */
+ mov edx, [esp+4]
+ mov [edx], eax
+ mov edx, [esp+8]
+ mov [edx], ecx
+
+ /* return */
+ ret 8
+
_____
Modified: trunk/reactos/lib/rtl/i386/except.s
--- trunk/reactos/lib/rtl/i386/except.s 2005-09-12 01:32:11 UTC (rev
17813)
+++ trunk/reactos/lib/rtl/i386/except.s 2005-09-12 02:57:47 UTC (rev
17814)
@@ -24,22 +24,6 @@
/* FUNCTIONS
****************************************************************/
-.globl _RtlpGetStackLimits@8
-_RtlpGetStackLimits@8:
-
- /* Get the stack limits */
- mov eax, [fs:TEB_STACK_LIMIT]
- mov ecx, [fs:TEB_STACK_BASE]
-
- /* Return them */
- mov edx, [esp+4]
- mov [edx], eax
- mov edx, [esp+8]
- mov [edx], ecx
-
- /* return */
- ret 8
-
.globl _RtlpGetExceptionList@0
_RtlpGetExceptionList@0:
_____
Modified: trunk/reactos/ntoskrnl/ke/exception.c
--- trunk/reactos/ntoskrnl/ke/exception.c 2005-09-12 01:32:11 UTC
(rev 17813)
+++ trunk/reactos/ntoskrnl/ke/exception.c 2005-09-12 02:57:47 UTC
(rev 17814)
@@ -23,7 +23,7 @@
CONTEXT LocalContext;
/* We'll have to make a copy and probe it */
- ProbeForRead(Context, sizeof(CONTEXT), sizeof(ULONG));
+ //ProbeForRead(Context, sizeof(CONTEXT), sizeof(ULONG));
RtlMoveMemory(&LocalContext, Context, sizeof(CONTEXT));
Context = &LocalContext;
@@ -99,6 +99,7 @@
/* Check the previous mode */
if (PreviousMode != KernelMode)
{
+#if 0
/* Probe the context */
ProbeForRead(Context, sizeof(CONTEXT), sizeof(ULONG));
@@ -107,13 +108,14 @@
FIELD_OFFSET(EXCEPTION_RECORD,
NumberParameters) +
sizeof(ULONG),
sizeof(ULONG));
-
+#endif
/* Validate the maximum parameters */
if ((ParameterCount = ExceptionRecord->NumberParameters) >
EXCEPTION_MAXIMUM_PARAMETERS)
{
/* Too large */
- return STATUS_INVALID_PARAMETER;
+ Status = STATUS_INVALID_PARAMETER;
+ _SEH_LEAVE;
}
/* Probe the entire parameters now*/
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c
--- trunk/reactos/ntoskrnl/ke/i386/exp.c 2005-09-12 01:32:11 UTC
(rev 17813)
+++ trunk/reactos/ntoskrnl/ke/i386/exp.c 2005-09-12 02:57:47 UTC
(rev 17814)
@@ -930,6 +930,7 @@
KD_CONTINUE_TYPE Action;
ULONG_PTR Stack, NewStack;
ULONG Size;
+ BOOLEAN UserDispatch = FALSE;
DPRINT1("KiDispatchException() called\n");
/* Increase number of Exception Dispatches */
@@ -1042,7 +1043,8 @@
/* Set EIP to the User-mode Dispathcer */
TrapFrame->Eip = (ULONG)KeUserExceptionDispatcher;
- return;
+ UserDispatch = TRUE;
+ _SEH_LEAVE;
}
_SEH_HANDLE
{
@@ -1051,6 +1053,9 @@
_SEH_END;
}
+ /* If we dispatch to user, return now */
+ if (UserDispatch) return;
+
/* FIXME: Forward the exception to the debugger for 2nd chance
*/
/* 3rd strike, kill the thread */
_____
Modified: trunk/reactos/ntoskrnl/rtl/i386/seh.s
--- trunk/reactos/ntoskrnl/rtl/i386/seh.s 2005-09-12 01:32:11 UTC
(rev 17813)
+++ trunk/reactos/ntoskrnl/rtl/i386/seh.s 2005-09-12 02:57:47 UTC
(rev 17814)
@@ -9,6 +9,8 @@
* Please keep them in sync.
*/
+#include <ndk/asm.h>
+
#define ExceptionContinueExecution 0
#define ExceptionContinueSearch 1
#define ExceptionNestedException 2
@@ -364,3 +366,26 @@
// We should never get here
ret
+
+.intel_syntax noprefix
+.globl _RtlpGetStackLimits@8
+_RtlpGetStackLimits@8:
+
+ /* Get the current thread */
+ mov eax, [fs:KPCR_CURRENT_THREAD]
+
+ /* Get the stack limits */
+ mov ecx, [eax+KTHREAD_STACK_LIMIT]
+ mov edx, [eax+KTHREAD_INITIAL_STACK]
+ sub edx, SIZEOF_FX_SAVE_AREA
+
+ /* Return them */
+ mov eax, [esp+4]
+ mov [eax], ecx
+
+ mov eax, [esp+8]
+ mov [eax], edx
+
+ /* return */
+ ret 8
+