From: Royce Mitchell III Date: Tue, 21 Dec 2004 04:05:18 +0000 (+0000) Subject: wrap stack walks in SEH - this doesn't fix page faults tho, so something else is... X-Git-Tag: backups/ELF_support@12700~2^2~56 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=73df8e08721172561c069430c1186e90fe7625ef wrap stack walks in SEH - this doesn't fix page faults tho, so something else is going to have to be done :( svn path=/trunk/; revision=12269 --- diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index 08f63e69214..7de1d53cb00 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -361,6 +361,9 @@ KeResetEvent(IN PKEVENT Event); VOID STDCALL KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ); +ULONG STDCALL +KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount ); + BOOLEAN STDCALL KeRosPrintAddress(PVOID address); diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 13e991b1462..429db8cc8c3 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -30,6 +30,7 @@ /* INCLUDES *****************************************************************/ #include +#include #define NDEBUG #include @@ -630,16 +631,23 @@ VOID 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 @@ KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ) 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) + diff --git a/reactos/ntoskrnl/mm/RPoolMgr.h b/reactos/ntoskrnl/mm/RPoolMgr.h index d742b88fb4c..379f13a33de 100644 --- a/reactos/ntoskrnl/mm/RPoolMgr.h +++ b/reactos/ntoskrnl/mm/RPoolMgr.h @@ -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 @@ RPoolRemoveFree ( PR_POOL pool, PR_FREE Item ) #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 diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index d0ba365cb07..512ba064840 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -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" diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 6ce729942c8..be3dbd143e7 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -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_ULONG@12 READ_REGISTER_BUFFER_USHORT@12 KeRosPrintAddress@4 KeRosDumpStackFrames@8 +KeRosGetStackFrames@8 RtlAbsoluteToSelfRelativeSD@12 RtlAddAccessAllowedAce@16 RtlAddAce@20 diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index a622d54a536..47641fb4b21 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -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_PCH = w32k.h TARGET_DDKLIBS = freetype.a +TARGET_LIBS = \ + $(SDK_PATH_LIB)/libpseh.a + TARGET_REGTESTS = yes FREETYPE_DIR = $(PATH_TO_TOP)/lib/freetype diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index e5fea319eee..102fd4bbb61 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -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 +#include #define NDEBUG #include +#include + #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 @@ LockHandle: 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)