Commit in reactos on MAIN
include/ddk/kefuncs.h+31.50 -> 1.51
ntoskrnl/ke/i386/exp.c+61-201.100 -> 1.101
ntoskrnl/mm/RPoolMgr.h+9-481.2 -> 1.3
           /ppool.c+2-11.38 -> 1.39
ntoskrnl/ntoskrnl.def+2-11.204 -> 1.205
subsys/win32k/makefile+4-11.107 -> 1.108
subsys/win32k/objects/gdiobj.c+9-171.82 -> 1.83
+90-88
7 modified files
wrap stack walks in SEH - this doesn't fix page faults tho, so something else is going to have to be done :(

reactos/include/ddk
kefuncs.h 1.50 -> 1.51
diff -u -r1.50 -r1.51
--- kefuncs.h	18 Dec 2004 20:55:54 -0000	1.50
+++ kefuncs.h	21 Dec 2004 04:05:17 -0000	1.51
@@ -361,6 +361,9 @@
 VOID STDCALL
 KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount );
 
+ULONG STDCALL
+KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount );
+
 BOOLEAN STDCALL
 KeRosPrintAddress(PVOID address);
 

reactos/ntoskrnl/ke/i386
exp.c 1.100 -> 1.101
diff -u -r1.100 -r1.101
--- exp.c	19 Dec 2004 05:08:53 -0000	1.100
+++ exp.c	21 Dec 2004 04:05:17 -0000	1.101
@@ -30,6 +30,7 @@
 /* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
+#include <pseh.h>
 #define NDEBUG
 #include <internal/debug.h>
 
@@ -630,16 +631,23 @@
 KeDumpStackFrames(PULONG Frame)
 {
 	DbgPrint("Frames: ");
-	while ( MmIsAddressValid(Frame) )
+	_SEH_TRY
+	{
+		while ( MmIsAddressValid(Frame) )
+		{
+			ULONG Addr = Frame[1];
+			if (!KeRosPrintAddress((PVOID)Addr))
+				DbgPrint("<%X>", Addr);
+			if ( Addr == 0 || Addr == 0xDEADBEEF )
+				break;
+			Frame = (PULONG)Frame[0];
+			DbgPrint(" ");
+		}
+	}
+	_SEH_HANDLE
 	{
-		ULONG Addr = Frame[1];
-		if (!KeRosPrintAddress((PVOID)Addr))
-			DbgPrint("<%X>", Addr);
-		if ( Addr == 0 || Addr == 0xDEADBEEF )
-			break;
-		Frame = (PULONG)Frame[0];
-		DbgPrint(" ");
 	}
+	_SEH_END;
 	DbgPrint("\n");
 }
 
@@ -649,29 +657,62 @@
 	ULONG i=0;
 
 	DbgPrint("Frames: ");
-	if ( !Frame )
+	_SEH_TRY
+	{
+		if ( !Frame )
+		{
+#if defined __GNUC__
+			__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
+#elif defined(_MSC_VER)
+			__asm mov [Frame], ebp
+#endif
+			//Frame = (PULONG)Frame[0]; // step out of KeRosDumpStackFrames
+		}
+		while ( MmIsAddressValid(Frame) && i++ < FrameCount )
+		{
+			ULONG Addr = Frame[1];
+			if (!KeRosPrintAddress((PVOID)Addr))
+				DbgPrint("<%X>", Addr);
+			if ( Addr == 0 || Addr == 0xDEADBEEF )
+				break;
+			Frame = (PULONG)Frame[0];
+			DbgPrint(" ");
+		}
+	}
+	_SEH_HANDLE
+	{
+	}
+	_SEH_END;
+	DbgPrint("\n");
+}
+
+ULONG STDCALL
+KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount )
+{
+	ULONG Count = 0;
+	PULONG Frame;
+	_SEH_TRY
 	{
 #if defined __GNUC__
 		__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
 #elif defined(_MSC_VER)
 		__asm mov [Frame], ebp
 #endif
-		//Frame = (PULONG)Frame[0]; // step out of KeRosDumpStackFrames
+		while ( Count < FrameCount )
+		{
+			Frames[Count++] = Frame[1];
+			Frame = (PULONG)Frame[0];
+		}
 	}
-	while ( MmIsAddressValid(Frame) && i++ < FrameCount )
+	_SEH_HANDLE
 	{
-		ULONG Addr = Frame[1];
-		if (!KeRosPrintAddress((PVOID)Addr))
-			DbgPrint("<%X>", Addr);
-		if ( Addr == 0 || Addr == 0xDEADBEEF )
-			break;
-		Frame = (PULONG)Frame[0];
-		DbgPrint(" ");
 	}
-	DbgPrint("\n");
+	_SEH_END;
+	return Count;
 }
 
-static void set_system_call_gate(unsigned int sel, unsigned int func)
+static void
+set_system_call_gate(unsigned int sel, unsigned int func)
 {
    DPRINT("sel %x %d\n",sel,sel);
    KiIdt[sel].a = (((int)func)&0xffff) +

reactos/ntoskrnl/mm
RPoolMgr.h 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- RPoolMgr.h	18 Dec 2004 21:30:17 -0000	1.2
+++ RPoolMgr.h	21 Dec 2004 04:05:18 -0000	1.3
@@ -1,4 +1,4 @@
-/* $Id: RPoolMgr.h,v 1.2 2004/12/18 21:30:17 royce Exp $
+/* $Id: RPoolMgr.h,v 1.3 2004/12/21 04:05:18 royce Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -249,65 +249,26 @@
 #endif//DBG || KDBG
 }
 
-// this function is used to walk up a stack trace... it returns
-// the pointer to the next return address above the pointer to the
-// return address pointed to by Frame...
-static rulong*
-RNextStackFrame ( rulong* Frame )
-{
-	if ( !Frame || !*Frame || *Frame == 0xDEADBEAF )
-		return NULL;
-	return (rulong*)(  Frame[-1] ) + 1;
-}
-
-// this function returns a pointer to the address the
-// caller will return to. Use RNextStackFrame() above to walk
-// further up the stack.
-static rulong*
-RStackFrame()
-{
-	rulong* Frame;
-#if defined __GNUC__
-	__asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
-#elif defined(_MSC_VER)
-	__asm mov [Frame], ebp
-#endif
-	return RNextStackFrame ( Frame + 1 );
-}
-
 static void
 RFreeFillStack ( PR_FREE free )
 {
-	rulong* Frame = RStackFrame();
 	int i;
-	memset ( free->LastOwnerStack, 0, sizeof(free->LastOwnerStack) );
-	Frame = RNextStackFrame ( Frame ); // step out of RFreeInit()
-	Frame = RNextStackFrame ( Frame ); // step out of RFreeSplit()/RPoolReclaim()
-	Frame = RNextStackFrame ( Frame ); // step out of RPoolFree()
+	ULONG stack[R_EXTRA_STACK_UP+3]; // need to skip 3 known levels of stack trace
+	memset ( stack, 0xCD, sizeof(stack) );
+	R_GET_STACK_FRAMES ( stack, R_EXTRA_STACK_UP+3 );
 	for ( i = 0; i < R_EXTRA_STACK_UP; i++ )
-		Frame = RNextStackFrame ( Frame );
-	for ( i = 0; i < R_STACK && Frame; i++ )
-	{
-		free->LastOwnerStack[i] = *Frame;
-		Frame = RNextStackFrame ( Frame );
-	}
+		free->LastOwnerStack[i] = stack[i+3];
 }
 
 static void
 RUsedFillStack ( PR_USED used )
 {
-	rulong* Frame = RStackFrame();
 	int i;
-	memset ( used->LastOwnerStack, 0, sizeof(used->LastOwnerStack) );
-	Frame = RNextStackFrame ( Frame ); // step out of RUsedInit()
-	Frame = RNextStackFrame ( Frame ); // step out of RPoolAlloc()
+	ULONG stack[R_EXTRA_STACK_UP+2]; // need to skip 2 known levels of stack trace
+	memset ( stack, 0xCD, sizeof(stack) );
+	R_GET_STACK_FRAMES ( stack, R_EXTRA_STACK_UP+2 );
 	for ( i = 0; i < R_EXTRA_STACK_UP; i++ )
-		Frame = RNextStackFrame ( Frame );
-	for ( i = 0; i < R_STACK && Frame; i++ )
-	{
-		used->LastOwnerStack[i] = *Frame;
-		Frame = RNextStackFrame ( Frame );
-	}
+		used->LastOwnerStack[i] = stack[i+2];
 }
 
 static PR_FREE

reactos/ntoskrnl/mm
ppool.c 1.38 -> 1.39
diff -u -r1.38 -r1.39
--- ppool.c	18 Dec 2004 21:27:27 -0000	1.38
+++ ppool.c	21 Dec 2004 04:05:18 -0000	1.39
@@ -1,4 +1,4 @@
-/* $Id: ppool.c,v 1.38 2004/12/18 21:27:27 royce Exp $
+/* $Id: ppool.c,v 1.39 2004/12/21 04:05:18 royce Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -32,6 +32,7 @@
 #define R_PANIC() KeBugCheck(0)
 #define R_DEBUG DbgPrint
 #define R_EXTRA_STACK_UP 2
+#define R_GET_STACK_FRAMES(ptr,cnt) KeRosGetStackFrames(ptr,cnt)
 
 #include "RPoolMgr.h"
 

reactos/ntoskrnl
ntoskrnl.def 1.204 -> 1.205
diff -u -r1.204 -r1.205
--- ntoskrnl.def	17 Dec 2004 07:31:11 -0000	1.204
+++ ntoskrnl.def	21 Dec 2004 04:05:18 -0000	1.205
@@ -1,4 +1,4 @@
-; $Id: ntoskrnl.def,v 1.204 2004/12/17 07:31:11 fireball Exp $
+; $Id: ntoskrnl.def,v 1.205 2004/12/21 04:05:18 royce Exp $
 ;
 ; reactos/ntoskrnl/ntoskrnl.def
 ;
@@ -964,6 +964,7 @@
 READ_REGISTER_BUFFER_USHORT@12
 KeRosPrintAddress@4
 KeRosDumpStackFrames@8
+KeRosGetStackFrames@8
 RtlAbsoluteToSelfRelativeSD@12
 RtlAddAccessAllowedAce@16
 RtlAddAce@20

reactos/subsys/win32k
makefile 1.107 -> 1.108
diff -u -r1.107 -r1.108
--- makefile	12 Dec 2004 01:40:37 -0000	1.107
+++ makefile	21 Dec 2004 04:05:18 -0000	1.108
@@ -1,4 +1,4 @@
-# $Id: makefile,v 1.107 2004/12/12 01:40:37 weiden Exp $
+# $Id: makefile,v 1.108 2004/12/21 04:05:18 royce Exp $
 
 PATH_TO_TOP = ../..
 
@@ -14,6 +14,9 @@
 
 TARGET_DDKLIBS = freetype.a
 
+TARGET_LIBS = \
+	$(SDK_PATH_LIB)/libpseh.a
+
 TARGET_REGTESTS = yes
 
 FREETYPE_DIR = $(PATH_TO_TOP)/lib/freetype

reactos/subsys/win32k/objects
gdiobj.c 1.82 -> 1.83
diff -u -r1.82 -r1.83
--- gdiobj.c	19 Dec 2004 16:53:57 -0000	1.82
+++ gdiobj.c	21 Dec 2004 04:05:18 -0000	1.83
@@ -19,19 +19,25 @@
 /*
  * GDIOBJ.C - GDI object manipulation routines
  *
- * $Id: gdiobj.c,v 1.82 2004/12/19 16:53:57 weiden Exp $
+ * $Id: gdiobj.c,v 1.83 2004/12/21 04:05:18 royce Exp $
  */
 #include <w32k.h>
+#include <ddk/ntddk.h>
 
 #define NDEBUG
 #include <debug.h>
 
+#include <pseh.h>
+
 #ifdef __USE_W32API
 /* F*(&#$ header mess!!!! */
 HANDLE
 STDCALL PsGetProcessId(
    	PEPROCESS	Process
 	);
+/* ditto */
+ULONG STDCALL
+KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount );
 #endif /* __USE_W32API */
 
 
@@ -396,22 +402,8 @@
           InterlockedExchange(&Entry->ProcessId, CurrentProcessId);
 
 #ifdef GDI_DEBUG
-          {
-            PULONG Frame;
-			int which;
-#if defined __GNUC__
-            __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : );
-#elif defined(_MSC_VER)
-            __asm mov [Frame], ebp
-#endif
-			for ( which = 0; which < GDI_STACK_LEVELS && Frame[1] != 0 && Frame[1] != 0xDEADBEEF; which++ )
-			{
-				GDIHandleAllocator[Index][which] = Frame[1];
-				Frame = ((PULONG)Frame[0]);
-			}
-			for ( ; which < GDI_STACK_LEVELS; which++ )
-				GDIHandleAllocator[Index][which] = 0xDEADBEEF;
-          }
+          memset ( GDIHandleAllocator[Index], 0xcd, GDI_STACK_LEVELS * sizeof(ULONG) );
+          KeRosGetStackFrames ( GDIHandleAllocator[Index], GDI_STACK_LEVELS );
 #endif /* GDI_DEBUG */
 
           if(W32Process != NULL)
CVSspam 0.2.8