diff --git a/reactos/subsystems/win32/win32k/include/gdidebug.h b/reactos/subsystems/win32/win32k/include/gdidebug.h new file mode 100644 index 00000000000..42c20f97c82 --- /dev/null +++ b/reactos/subsystems/win32/win32k/include/gdidebug.h @@ -0,0 +1,75 @@ +#pragma once + +extern ULONG gulDebugChannels; + +enum _DEBUGCHANNELS +{ + DbgCustom = 1, + DbgObjects = 2, + DbgBitBlt = 4, + DbgXlate = 8, + DbgModeSwitch = 16, +}; + +#define DBGENABLE(ch) gulDebugChannels |= (ch); +#define DBGDISABLE(ch) gulDebugChannels &= ~(ch); +#define DPRINTCH(ch) if (gulDebugChannels & (ch)) DbgPrint + +#ifdef GDI_DEBUG + +#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) +NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); + +#define IS_HANDLE_VALID(idx) \ + ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) + +#define GDIDBG_TRACECALLER() \ + DPRINT1("-> called from:\n"); \ + KeRosDumpStackFrames(NULL, 20); +#define GDIDBG_TRACEALLOCATOR(handle) \ + DPRINT1("-> allocated from:\n"); \ + KeRosDumpStackFrames(GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_TRACELOCKER(handle) \ + DPRINT1("-> locked from:\n"); \ + KeRosDumpStackFrames(GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_TRACESHARELOCKER(handle) \ + DPRINT1("-> locked from:\n"); \ + KeRosDumpStackFrames(GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_TRACEDELETER(handle) \ + DPRINT1("-> deleted from:\n"); \ + KeRosDumpStackFrames(GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_CAPTUREALLOCATOR(handle) \ + CaptureStackBackTace((PVOID*)GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_CAPTURELOCKER(handle) \ + CaptureStackBackTace((PVOID*)GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_CAPTURESHARELOCKER(handle) \ + CaptureStackBackTace((PVOID*)GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_CAPTUREDELETER(handle) \ + CaptureStackBackTace((PVOID*)GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); +#define GDIDBG_DUMPHANDLETABLE() \ + IntDumpHandleTable(GdiHandleTable) +#define GDIDBG_INITLOOPTRACE() \ + ULONG Attempts = 0; +#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) \ + if ((++Attempts % 20) == 0) \ + { \ + DPRINT1("[%d] Handle 0x%p Locked by 0x%x (we're 0x%x)\n", Attempts, Handle, PrevThread, Thread); \ + } + +#else + +#define GDIDBG_TRACECALLER() +#define GDIDBG_TRACEALLOCATOR(index) +#define GDIDBG_TRACELOCKER(index) +#define GDIDBG_TRACESHARELOCKER(index) +#define GDIDBG_CAPTUREALLOCATOR(index) +#define GDIDBG_CAPTURELOCKER(index) +#define GDIDBG_CAPTURESHARELOCKER(index) +#define GDIDBG_CAPTUREDELETER(handle) +#define GDIDBG_DUMPHANDLETABLE() +#define GDIDBG_INITLOOPTRACE() +#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) +#define GDIDBG_TRACEDELETER(handle) + +#endif /* GDI_DEBUG */ + diff --git a/reactos/subsystems/win32/win32k/include/win32kp.h b/reactos/subsystems/win32/win32k/include/win32kp.h index 7842bb276d9..94bf3190b85 100644 --- a/reactos/subsystems/win32/win32k/include/win32kp.h +++ b/reactos/subsystems/win32/win32k/include/win32kp.h @@ -87,3 +87,4 @@ #include #include #include +#include diff --git a/reactos/subsystems/win32/win32k/objects/gdidbg.c b/reactos/subsystems/win32/win32k/objects/gdidbg.c index efa686fc06b..3a0ac31600b 100644 --- a/reactos/subsystems/win32/win32k/objects/gdidbg.c +++ b/reactos/subsystems/win32/win32k/objects/gdidbg.c @@ -1,7 +1,21 @@ -#ifdef GDI_DEBUG +/* + * PROJECT: ReactOS win32 kernel mode subsystem + * LICENSE: GPL - See COPYING in the top level directory + * FILE: subsystems/win32/win32k/objects/gdidbg.c + * PURPOSE: Special debugging functions for gdi + * PROGRAMMERS: Timo Kreuzer + */ -#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) -NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); +/** INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + + +ULONG gulDebugChannels = 0; + +#ifdef GDI_DEBUG #define GDI_STACK_LEVELS 20 static ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; @@ -37,9 +51,6 @@ CompareBacktraces(ULONG idx1, ULONG idx2) return TRUE; } -#define IS_HANDLE_VALID(idx) \ - ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) - void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) { static int leak_reported = 0; @@ -110,8 +121,8 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) for (i = 0; i < nTraces && AllocatorTable[i].count > 1; i++) { /* Print out the allocation count */ - DbgPrint(" %i allocs, type = 0x%lx:\n", - AllocatorTable[i].count, + DbgPrint(" %i allocs, type = 0x%lx:\n", + AllocatorTable[i].count, GdiHandleTable->Entries[AllocatorTable[i].idx].Type); /* Dump the frames */ @@ -272,39 +283,6 @@ GdiDbgHTIntegrityCheck() return r; } -#define GDIDBG_TRACECALLER() \ - DPRINT1("-> called from:\n"); \ - KeRosDumpStackFrames(NULL, 20); -#define GDIDBG_TRACEALLOCATOR(handle) \ - DPRINT1("-> allocated from:\n"); \ - KeRosDumpStackFrames(GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACELOCKER(handle) \ - DPRINT1("-> locked from:\n"); \ - KeRosDumpStackFrames(GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACESHARELOCKER(handle) \ - DPRINT1("-> locked from:\n"); \ - KeRosDumpStackFrames(GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACEDELETER(handle) \ - DPRINT1("-> deleted from:\n"); \ - KeRosDumpStackFrames(GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTUREALLOCATOR(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTURELOCKER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTURESHARELOCKER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTUREDELETER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_DUMPHANDLETABLE() \ - IntDumpHandleTable(GdiHandleTable) -#define GDIDBG_INITLOOPTRACE() \ - ULONG Attempts = 0; -#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) \ - if ((++Attempts % 20) == 0) \ - { \ - DPRINT1("[%d] Handle 0x%p Locked by 0x%x (we're 0x%x)\n", Attempts, Handle, PrevThread, Thread); \ - } - ULONG FASTCALL GDIOBJ_IncrementShareCount(POBJ Object) @@ -315,20 +293,5 @@ GDIOBJ_IncrementShareCount(POBJ Object) return cLocks; } -#else - -#define GDIDBG_TRACECALLER() -#define GDIDBG_TRACEALLOCATOR(index) -#define GDIDBG_TRACELOCKER(index) -#define GDIDBG_TRACESHARELOCKER(index) -#define GDIDBG_CAPTUREALLOCATOR(index) -#define GDIDBG_CAPTURELOCKER(index) -#define GDIDBG_CAPTURESHARELOCKER(index) -#define GDIDBG_CAPTUREDELETER(handle) -#define GDIDBG_DUMPHANDLETABLE() -#define GDIDBG_INITLOOPTRACE() -#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) -#define GDIDBG_TRACEDELETER(handle) - #endif /* GDI_DEBUG */ diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index beeee0a7cdf..deb62e6ea10 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -8,8 +8,6 @@ /** INCLUDES ******************************************************************/ -//#define GDI_DEBUG - #include #define NDEBUG #include @@ -28,8 +26,6 @@ DPRINT("%s:%i: Delay\n", __FILE__, __LINE__); \ KeDelayExecutionThread(KernelMode, FALSE, &ShortDelay) -#include "gdidbg.c" - static BOOL INTERNAL_CALL GDI_CleanupDummy(PVOID ObjectBody); diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild index a472d21178e..fa51a09635a 100644 --- a/reactos/subsystems/win32/win32k/win32k.rbuild +++ b/reactos/subsystems/win32/win32k/win32k.rbuild @@ -184,6 +184,7 @@ freetype.c gdibatch.c gdiobj.c + gdidbg.c icm.c line.c metafile.c