7 modified files
reactos/include/ddk
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
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
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
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
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
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
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