From a5aa252f4796e4a5fef3ff023f8427a937032132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 15 May 2010 09:57:36 +0000 Subject: [PATCH] [WIN32K] - clean up some debugging code - set NULL owner when setting BASEFLAG_READY_TO_DIE, so that the handle can be freed. svn path=/branches/reactos-yarotows/; revision=47217 --- subsystems/win32/win32k/objects/gdiobj.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/subsystems/win32/win32k/objects/gdiobj.c b/subsystems/win32/win32k/objects/gdiobj.c index 191b736b6d9..999aab39d29 100644 --- a/subsystems/win32/win32k/objects/gdiobj.c +++ b/subsystems/win32/win32k/objects/gdiobj.c @@ -631,11 +631,22 @@ LockHandle: } else if (Object->ulShareCount != 0) { + NTSTATUS Status; + PEPROCESS OldProcess; Object->BaseFlags |= BASEFLAG_READY_TO_DIE; DPRINT("Object %p, ulShareCount = %d\n", Object->hHmgr, Object->ulShareCount); - //GDIDBG_TRACECALLER(); - //GDIDBG_TRACESHARELOCKER(GDI_HANDLE_GET_INDEX(hObj)); - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); + /* Set NULL owner. Do the work here to avoid race conditions */ + Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); + if (NT_SUCCESS(Status)) + { + PPROCESSINFO W32Process = (PPROCESSINFO)OldProcess->Win32Process; + if (W32Process != NULL) + { + InterlockedDecrement(&W32Process->GDIHandleCount); + } + ObDereferenceObject(OldProcess); + } + (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, NULL); /* Don't wait on shared locks */ return FALSE; } @@ -1037,11 +1048,6 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType) { if (Object->Tid != Thread) { - GDIDBG_TRACELOOP(hObj, Object->Tid, Thread); - GDIDBG_TRACECALLER(); - GDIDBG_TRACELOCKER(hObj); - GDIDBG_TRACEALLOCATOR(hObj); - /* Unlock the handle table entry. */ (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId);