Add A function to dump all locked handles and call it when an assertion about 0 locks fails.
svn path=/trunk/; revision=50969
void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable);
ULONG CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture);
BOOL GdiDbgHTIntegrityCheck();
void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable);
ULONG CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture);
BOOL GdiDbgHTIntegrityCheck();
+void GdiDbgDumpLockedHandles();
#define DBGENABLE(ch) gulDebugChannels |= (ch);
#define DBGDISABLE(ch) gulDebugChannels &= ~(ch);
#define DBGENABLE(ch) gulDebugChannels |= (ch);
#define DBGDISABLE(ch) gulDebugChannels &= ~(ch);
#define ID_Win32PostServiceHook 'WSH1'
FORCEINLINE void
#define ID_Win32PostServiceHook 'WSH1'
FORCEINLINE void
-DbgAssertNoGdiLocks(char * pszFile, ULONG nLine)
+GdiDbgAssertNoLocks(char * pszFile, ULONG nLine)
{
PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread();
if (pti && pti->cExclusiveLocks != 0)
{
DbgPrint("(%s:%ld) There are %ld exclusive locks!\n",
pszFile, nLine, pti->cExclusiveLocks);
{
PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread();
if (pti && pti->cExclusiveLocks != 0)
{
DbgPrint("(%s:%ld) There are %ld exclusive locks!\n",
pszFile, nLine, pti->cExclusiveLocks);
+ GdiDbgDumpLockedHandles();
-#define ASSERT_NOGDILOCKS() DbgAssertNoGdiLocks(__FILE__,__LINE__)
+
+#define ASSERT_NOGDILOCKS() GdiDbgAssertNoLocks(__FILE__,__LINE__)
#else
#define ASSERT_NOGDILOCKS()
#endif
#else
#define ASSERT_NOGDILOCKS()
#endif
+void
+GdiDbgDumpLockedHandles()
+{
+ ULONG i;
+
+ for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++)
+ {
+ PGDI_TABLE_ENTRY pEntry = &GdiHandleTable->Entries[i];
+
+ if (pEntry->Type & GDI_ENTRY_BASETYPE_MASK)
+ {
+ BASEOBJECT *pObject = pEntry->KernelData;
+ if (pObject->cExclusiveLock > 0)
+ {
+ DPRINT1("Locked object: %lx, type = %lx. allocated from:\n",
+ i, pEntry->Type);
+ GDIDBG_TRACEALLOCATOR(i);
+ DPRINT1("Locked from:\n");
+ GDIDBG_TRACELOCKER(i);
+ }
+ }
+ }
+}
+
void
NTAPI
DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
void
NTAPI
DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)