[FORMATTING] apply a consistent indentation (4 spaces), no code change

svn path=/trunk/; revision=32553
This commit is contained in:
Timo Kreuzer 2008-03-04 00:14:11 +00:00
parent 7f8158f09e
commit 351736138c

View file

@ -153,7 +153,7 @@ GDIOBJ_iAllocHandleTable(OUT PSECTION_OBJECT *SectionObject)
HandleTable->LookasideLists = ExAllocatePoolWithTag(NonPagedPool, HandleTable->LookasideLists = ExAllocatePoolWithTag(NonPagedPool,
BASE_OBJTYPE_COUNT * sizeof(PAGED_LOOKASIDE_LIST), BASE_OBJTYPE_COUNT * sizeof(PAGED_LOOKASIDE_LIST),
TAG_GDIHNDTBLE); TAG_GDIHNDTBLE);
if(HandleTable->LookasideLists == NULL) if (HandleTable->LookasideLists == NULL)
{ {
MmUnmapViewInSystemSpace(HandleTable); MmUnmapViewInSystemSpace(HandleTable);
ObDereferenceObject(*SectionObject); ObDereferenceObject(*SectionObject);
@ -161,12 +161,17 @@ GDIOBJ_iAllocHandleTable(OUT PSECTION_OBJECT *SectionObject)
return NULL; return NULL;
} }
for(ObjType = 0; ObjType < BASE_OBJTYPE_COUNT; ObjType++) for (ObjType = 0; ObjType < BASE_OBJTYPE_COUNT; ObjType++)
{ {
if (ObjTypeInfo[ObjType].bUseLookaside) if (ObjTypeInfo[ObjType].bUseLookaside)
{ {
ExInitializePagedLookasideList(HandleTable->LookasideLists + ObjType, NULL, NULL, 0, ExInitializePagedLookasideList(HandleTable->LookasideLists + ObjType,
ObjTypeInfo[ObjType].ulBodySize, ObjTypeInfo[ObjType].Tag, 0); NULL,
NULL,
0,
ObjTypeInfo[ObjType].ulBodySize,
ObjTypeInfo[ObjType].Tag,
0);
} }
} }
@ -214,7 +219,7 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable)
{ {
int i, n = 0, j, k, J; int i, n = 0, j, k, J;
if ( leak_reported ) if (leak_reported)
{ {
DPRINT1("gdi handle abusers already reported!\n"); DPRINT1("gdi handle abusers already reported!\n");
return; return;
@ -224,18 +229,18 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable)
DPRINT1("reporting gdi handle abusers:\n"); DPRINT1("reporting gdi handle abusers:\n");
/* step through GDI handle table and find out who our culprit is... */ /* step through GDI handle table and find out who our culprit is... */
for ( i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++ ) for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++)
{ {
for ( j = 0; j < n; j++ ) for (j = 0; j < n; j++)
{ {
next: next:
J = h[j].idx; J = h[j].idx;
for ( k = 0; k < GDI_STACK_LEVELS; k++ ) for (k = 0; k < GDI_STACK_LEVELS; k++)
{ {
if ( GDIHandleAllocator[i][k] if (GDIHandleAllocator[i][k]
!= GDIHandleAllocator[J][k] ) != GDIHandleAllocator[J][k])
{ {
if ( ++j == n ) if (++j == n)
goto done; goto done;
else else
goto next; goto next;
@ -244,9 +249,9 @@ next:
goto done; goto done;
} }
done: done:
if ( j < H ) if (j < H)
{ {
if ( j == n ) if (j == n)
{ {
h[j].idx = i; h[j].idx = i;
h[j].count = 1; h[j].count = 1;
@ -257,35 +262,35 @@ done:
} }
} }
/* bubble sort time! weeeeee!! */ /* bubble sort time! weeeeee!! */
for ( i = 0; i < n-1; i++ ) for (i = 0; i < n-1; i++)
{ {
if ( h[i].count < h[i+1].count ) if (h[i].count < h[i+1].count)
{ {
struct DbgOpenGDIHandle t; struct DbgOpenGDIHandle t;
t = h[i+1]; t = h[i+1];
h[i+1] = h[i]; h[i+1] = h[i];
j = i; j = i;
while ( j > 0 && h[j-1].count < t.count ) while (j > 0 && h[j-1].count < t.count)
j--; j--;
h[j] = t; h[j] = t;
} }
} }
/* print the worst offenders... */ /* print the worst offenders... */
DbgPrint ( "Worst GDI Handle leak offenders (out of %i unique locations):\n", n ); DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", n);
for ( i = 0; i < n && h[i].count > 1; i++ ) for (i = 0; i < n && h[i].count > 1; i++)
{ {
int j; int j;
DbgPrint ( " %i allocs: ", h[i].count ); DbgPrint(" %i allocs: ", h[i].count);
for ( j = 0; j < GDI_STACK_LEVELS; j++ ) for (j = 0; j < GDI_STACK_LEVELS; j++)
{ {
ULONG Addr = GDIHandleAllocator[h[i].idx][j]; ULONG Addr = GDIHandleAllocator[h[i].idx][j];
if ( !KiRosPrintAddress ( (PVOID)Addr ) ) if (!KiRosPrintAddress((PVOID)Addr))
DbgPrint ( "<%X>", Addr ); DbgPrint("<%X>", Addr);
} }
DbgPrint ( "\n" ); DbgPrint("\n");
} }
if ( i < n && h[i].count == 1 ) if (i < n && h[i].count == 1)
DbgPrint ( "(list terminated - the remaining entries have 1 allocation only)\n" ); DbgPrint("(list terminated - the remaining entries have 1 allocation only)\n");
} }
ULONG ULONG
@ -430,11 +435,11 @@ INTERNAL_CALL
GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType) GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType)
{ {
PGDI_TABLE_ENTRY Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hObj); PGDI_TABLE_ENTRY Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hObj);
if((((ULONG_PTR)hObj & GDI_HANDLE_TYPE_MASK) == ObjectType) && if ((((ULONG_PTR)hObj & GDI_HANDLE_TYPE_MASK) == ObjectType) &&
(Entry->Type << GDI_ENTRY_UPPER_SHIFT) == GDI_HANDLE_GET_UPPER(hObj)) (Entry->Type << GDI_ENTRY_UPPER_SHIFT) == GDI_HANDLE_GET_UPPER(hObj))
{ {
HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1); HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
if(pid == NULL || pid == PsGetCurrentProcessId()) if (pid == NULL || pid == PsGetCurrentProcessId())
{ {
return TRUE; return TRUE;
} }
@ -467,7 +472,7 @@ GDIOBJ_AllocObj(ULONG ObjectType)
W32Process = PsGetCurrentProcessWin32Process(); W32Process = PsGetCurrentProcessWin32Process();
/* HACK HACK HACK: simplest-possible quota implementation - don't allow a process /* HACK HACK HACK: simplest-possible quota implementation - don't allow a process
to take too many GDI objects, itself. */ to take too many GDI objects, itself. */
if ( W32Process && W32Process->GDIObjects >= 0x2710 ) if (W32Process && W32Process->GDIObjects >= 0x2710)
return NULL; return NULL;
ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE); ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE);
@ -476,7 +481,7 @@ GDIOBJ_AllocObj(ULONG ObjectType)
if (ObjTypeInfo[TypeIndex].bUseLookaside) if (ObjTypeInfo[TypeIndex].bUseLookaside)
{ {
LookasideList = FindLookasideList(TypeIndex); LookasideList = FindLookasideList(TypeIndex);
if(LookasideList != NULL) if (LookasideList != NULL)
{ {
newObject = ExAllocateFromPagedLookasideList(LookasideList); newObject = ExAllocateFromPagedLookasideList(LookasideList);
} }
@ -487,7 +492,7 @@ GDIOBJ_AllocObj(ULONG ObjectType)
ObjTypeInfo[TypeIndex].ulBodySize, ObjTypeInfo[TypeIndex].ulBodySize,
ObjTypeInfo[TypeIndex].Tag); ObjTypeInfo[TypeIndex].Tag);
} }
if(newObject != NULL) if (newObject != NULL)
{ {
UINT Index; UINT Index;
PGDI_TABLE_ENTRY Entry; PGDI_TABLE_ENTRY Entry;
@ -512,7 +517,7 @@ GDIOBJ_AllocObj(ULONG ObjectType)
LockHandle: LockHandle:
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0);
if(PrevProcId == NULL) if (PrevProcId == NULL)
{ {
HGDIOBJ Handle; HGDIOBJ Handle;
@ -530,7 +535,7 @@ LockHandle:
GDIDBG_CAPTUREALLOCATOR(Index); GDIDBG_CAPTUREALLOCATOR(Index);
if(W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedIncrement(&W32Process->GDIObjects); _InterlockedIncrement(&W32Process->GDIObjects);
} }
@ -542,7 +547,7 @@ LockHandle:
else else
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Waiting on handle in index 0x%x\n", Attempts, Index); DPRINT1("[%d]Waiting on handle in index 0x%x\n", Attempts, Index);
} }
@ -598,7 +603,7 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ExpectedType)
DPRINT("GDIOBJ_FreeObj: hObj: 0x%08x\n", hObj); DPRINT("GDIOBJ_FreeObj: hObj: 0x%08x\n", hObj);
if(GDI_HANDLE_IS_STOCKOBJ(hObj)) if (GDI_HANDLE_IS_STOCKOBJ(hObj))
{ {
DPRINT1("GDIOBJ_FreeObj() failed, can't delete stock object handle: 0x%x !!!\n", hObj); DPRINT1("GDIOBJ_FreeObj() failed, can't delete stock object handle: 0x%x !!!\n", hObj);
GDIDBG_TRACECALLER(); GDIDBG_TRACECALLER();
@ -631,9 +636,9 @@ LockHandle:
/* lock the object, we must not delete global objects, so don't exchange the locking /* lock the object, we must not delete global objects, so don't exchange the locking
process ID to zero when attempting to lock a global object... */ process ID to zero when attempting to lock a global object... */
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId);
if(PrevProcId == ProcessId) if (PrevProcId == ProcessId)
{ {
if( (Entry->KernelData != NULL) && if ( (Entry->KernelData != NULL) &&
((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) && ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) &&
((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == (HandleUpper & GDI_ENTRY_BASETYPE_MASK)) ) ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == (HandleUpper & GDI_ENTRY_BASETYPE_MASK)) )
{ {
@ -641,7 +646,7 @@ LockHandle:
Object = Entry->KernelData; Object = Entry->KernelData;
if(Object->cExclusiveLock == 0) if (Object->cExclusiveLock == 0)
{ {
BOOL Ret; BOOL Ret;
PW32PROCESS W32Process = PsGetCurrentProcessWin32Process(); PW32PROCESS W32Process = PsGetCurrentProcessWin32Process();
@ -655,7 +660,7 @@ LockHandle:
/* push this entry to the free list */ /* push this entry to the free list */
InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry)); InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry));
if(W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedDecrement(&W32Process->GDIObjects); _InterlockedDecrement(&W32Process->GDIObjects);
} }
@ -668,7 +673,7 @@ LockHandle:
if (ObjTypeInfo[TypeIndex].bUseLookaside) if (ObjTypeInfo[TypeIndex].bUseLookaside)
{ {
LookasideList = FindLookasideList(TypeIndex); LookasideList = FindLookasideList(TypeIndex);
if(LookasideList != NULL) if (LookasideList != NULL)
{ {
ExFreeToPagedLookasideList(LookasideList, Object); ExFreeToPagedLookasideList(LookasideList, Object);
} }
@ -696,10 +701,10 @@ LockHandle:
(void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); (void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId);
} }
} }
else if(PrevProcId == LockedProcessId) else if (PrevProcId == LockedProcessId)
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Waiting on 0x%x\n", Attempts, hObj); DPRINT1("[%d]Waiting on 0x%x\n", Attempts, hObj);
} }
@ -712,9 +717,9 @@ LockHandle:
} }
else else
{ {
if(!Silent) if (!Silent)
{ {
if(((ULONG_PTR)PrevProcId & ~0x1) == 0) if (((ULONG_PTR)PrevProcId & ~0x1) == 0)
{ {
DPRINT1("Attempted to free global gdi handle 0x%x, caller needs to get ownership first!!!\n", hObj); DPRINT1("Attempted to free global gdi handle 0x%x, caller needs to get ownership first!!!\n", hObj);
DPRINT1("Type = 0x%lx, KernelData = 0x%p, ProcessId = 0x%p\n", Entry->Type, Entry->KernelData, Entry->ProcessId); DPRINT1("Type = 0x%lx, KernelData = 0x%p, ProcessId = 0x%p\n", Entry->Type, Entry->KernelData, Entry->ProcessId);
@ -758,7 +763,7 @@ FASTCALL
NtGdiDeleteObject(HGDIOBJ hObject) NtGdiDeleteObject(HGDIOBJ hObject)
{ {
DPRINT("NtGdiDeleteObject handle 0x%08x\n", hObject); DPRINT("NtGdiDeleteObject handle 0x%08x\n", hObject);
if(!IsObjectDead(hObject)) if (!IsObjectDead(hObject))
{ {
return NULL != hObject return NULL != hObject
? GDIOBJ_FreeObj(hObject, GDI_OBJECT_TYPE_DONTCARE) : FALSE; ? GDIOBJ_FreeObj(hObject, GDI_OBJECT_TYPE_DONTCARE) : FALSE;
@ -775,7 +780,7 @@ NtGdiDeleteObject(HGDIOBJ hObject)
* \param Process - PID of the process that will be destroyed. * \param Process - PID of the process that will be destroyed.
*/ */
BOOL INTERNAL_CALL BOOL INTERNAL_CALL
GDI_CleanupForProcess (struct _EPROCESS *Process) GDI_CleanupForProcess(struct _EPROCESS *Process)
{ {
PGDI_TABLE_ENTRY Entry, End; PGDI_TABLE_ENTRY Entry, End;
PEPROCESS CurrentProcess; PEPROCESS CurrentProcess;
@ -792,19 +797,20 @@ GDI_CleanupForProcess (struct _EPROCESS *Process)
W32Process = (PW32PROCESS)Process->Win32Process; W32Process = (PW32PROCESS)Process->Win32Process;
ASSERT(W32Process); ASSERT(W32Process);
if(W32Process->GDIObjects > 0) if (W32Process->GDIObjects > 0)
{ {
/* FIXME - Instead of building the handle here and delete it using GDIOBJ_FreeObj /* FIXME - Instead of building the handle here and delete it using GDIOBJ_FreeObj
we should delete it directly here! */ we should delete it directly here! */
ProcId = Process->UniqueProcessId; ProcId = Process->UniqueProcessId;
End = &GdiHandleTable->Entries[GDI_HANDLE_COUNT]; End = &GdiHandleTable->Entries[GDI_HANDLE_COUNT];
for(Entry = &GdiHandleTable->Entries[RESERVE_ENTRIES_COUNT]; for (Entry = &GdiHandleTable->Entries[RESERVE_ENTRIES_COUNT];
Entry != End; Entry != End;
Entry++, Index++) Entry++, Index++)
{ {
/* ignore the lock bit */ /* ignore the lock bit */
if((HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcId && (Entry->Type & ~GDI_ENTRY_REUSE_MASK) != 0) if ( (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcId &&
(Entry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 )
{ {
HGDIOBJ ObjectHandle; HGDIOBJ ObjectHandle;
@ -814,7 +820,7 @@ GDI_CleanupForProcess (struct _EPROCESS *Process)
simply ignore this fact here. */ simply ignore this fact here. */
ObjectHandle = (HGDIOBJ)(Index | (Entry->Type << GDI_ENTRY_UPPER_SHIFT)); ObjectHandle = (HGDIOBJ)(Index | (Entry->Type << GDI_ENTRY_UPPER_SHIFT));
if(GDIOBJ_FreeObj(ObjectHandle, GDI_OBJECT_TYPE_DONTCARE) && if (GDIOBJ_FreeObj(ObjectHandle, GDI_OBJECT_TYPE_DONTCARE) &&
W32Process->GDIObjects == 0) W32Process->GDIObjects == 0)
{ {
/* there are no more gdi handles for this process, bail */ /* there are no more gdi handles for this process, bail */
@ -845,7 +851,7 @@ GDI_CleanupForProcess (struct _EPROCESS *Process)
* \todo Get rid of the ExpectedType parameter! * \todo Get rid of the ExpectedType parameter!
*/ */
PGDIOBJ INTERNAL_CALL PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ExpectedType) GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType)
{ {
ULONG HandleIndex; ULONG HandleIndex;
PGDI_TABLE_ENTRY Entry; PGDI_TABLE_ENTRY Entry;
@ -983,7 +989,7 @@ GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ExpectedType)
* \todo Get rid of the ExpectedType parameter! * \todo Get rid of the ExpectedType parameter!
*/ */
PGDIOBJ INTERNAL_CALL PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ExpectedType) GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ExpectedType)
{ {
ULONG HandleIndex; ULONG HandleIndex;
PGDI_TABLE_ENTRY Entry; PGDI_TABLE_ENTRY Entry;
@ -1127,7 +1133,7 @@ GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle)
DPRINT("GDIOBJ_OwnedByCurrentProcess: ObjectHandle: 0x%08x\n", ObjectHandle); DPRINT("GDIOBJ_OwnedByCurrentProcess: ObjectHandle: 0x%08x\n", ObjectHandle);
if(!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle))
{ {
ProcessId = PsGetCurrentProcessId(); ProcessId = PsGetCurrentProcessId();
@ -1145,7 +1151,7 @@ GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle)
BOOL INTERNAL_CALL BOOL INTERNAL_CALL
GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj) GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj)
{ {
/* /*
* FIXME !!!!! THIS FUNCTION NEEDS TO BE FIXED - IT IS NOT SAFE WHEN OTHER THREADS * FIXME !!!!! THIS FUNCTION NEEDS TO BE FIXED - IT IS NOT SAFE WHEN OTHER THREADS
* MIGHT ATTEMPT TO LOCK THE OBJECT DURING THIS CALL!!! * MIGHT ATTEMPT TO LOCK THE OBJECT DURING THIS CALL!!!
*/ */
@ -1164,7 +1170,7 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj)
Thread = PsGetCurrentThreadWin32Thread(); Thread = PsGetCurrentThreadWin32Thread();
if(!GDI_HANDLE_IS_STOCKOBJ(hObj)) if (!GDI_HANDLE_IS_STOCKOBJ(hObj))
{ {
ProcessId = PsGetCurrentProcessId(); ProcessId = PsGetCurrentProcessId();
LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
@ -1174,7 +1180,7 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj)
LockHandle: LockHandle:
/* lock the object, we must not convert stock objects, so don't check!!! */ /* lock the object, we must not convert stock objects, so don't check!!! */
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId);
if(PrevProcId == ProcessId) if (PrevProcId == ProcessId)
{ {
LONG NewType, PrevType, OldType; LONG NewType, PrevType, OldType;
@ -1194,7 +1200,7 @@ LockHandle:
/* Try to exchange the type field - but only if the old (previous type) matches! */ /* Try to exchange the type field - but only if the old (previous type) matches! */
PrevType = _InterlockedCompareExchange(&Entry->Type, NewType, OldType); PrevType = _InterlockedCompareExchange(&Entry->Type, NewType, OldType);
if(PrevType == OldType && Entry->KernelData != NULL) if (PrevType == OldType && Entry->KernelData != NULL)
{ {
PW32THREAD PrevThread; PW32THREAD PrevThread;
POBJ Object; POBJ Object;
@ -1206,10 +1212,10 @@ LockHandle:
Object = Entry->KernelData; Object = Entry->KernelData;
PrevThread = Object->Tid; PrevThread = Object->Tid;
if(Object->cExclusiveLock == 0 || PrevThread == Thread) if (Object->cExclusiveLock == 0 || PrevThread == Thread)
{ {
/* dereference the process' object counter */ /* dereference the process' object counter */
if(PrevProcId != GDI_GLOBAL_PROCESS) if (PrevProcId != GDI_GLOBAL_PROCESS)
{ {
PEPROCESS OldProcess; PEPROCESS OldProcess;
PW32PROCESS W32Process; PW32PROCESS W32Process;
@ -1217,10 +1223,10 @@ LockHandle:
/* FIXME */ /* FIXME */
Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess);
if(NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
W32Process = (PW32PROCESS)OldProcess->Win32Process; W32Process = (PW32PROCESS)OldProcess->Win32Process;
if(W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedDecrement(&W32Process->GDIObjects); _InterlockedDecrement(&W32Process->GDIObjects);
} }
@ -1240,7 +1246,7 @@ LockHandle:
else else
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread); DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread);
} }
@ -1260,10 +1266,10 @@ LockHandle:
DPRINT1("OldType = 0x%x, Entry->Type = 0x%x, NewType = 0x%x, Entry->KernelData = 0x%x\n", OldType, Entry->Type, NewType, Entry->KernelData); DPRINT1("OldType = 0x%x, Entry->Type = 0x%x, NewType = 0x%x, Entry->KernelData = 0x%x\n", OldType, Entry->Type, NewType, Entry->KernelData);
} }
} }
else if(PrevProcId == LockedProcessId) else if (PrevProcId == LockedProcessId)
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Waiting on 0x%x\n", Attempts, hObj); DPRINT1("[%d]Waiting on 0x%x\n", Attempts, hObj);
} }
@ -1297,7 +1303,7 @@ GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner)
Thread = PsGetCurrentThreadWin32Thread(); Thread = PsGetCurrentThreadWin32Thread();
if(!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle))
{ {
ProcessId = PsGetCurrentProcessId(); ProcessId = PsGetCurrentProcessId();
LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
@ -1307,16 +1313,16 @@ GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner)
LockHandle: LockHandle:
/* lock the object, we must not convert stock objects, so don't check!!! */ /* lock the object, we must not convert stock objects, so don't check!!! */
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, ProcessId, LockedProcessId); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, ProcessId, LockedProcessId);
if(PrevProcId == ProcessId) if (PrevProcId == ProcessId)
{ {
PW32THREAD PrevThread; PW32THREAD PrevThread;
if((Entry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 && Entry->KernelData != NULL) if ((Entry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 && Entry->KernelData != NULL)
{ {
POBJ Object = Entry->KernelData; POBJ Object = Entry->KernelData;
PrevThread = Object->Tid; PrevThread = Object->Tid;
if(Object->cExclusiveLock == 0 || PrevThread == Thread) if (Object->cExclusiveLock == 0 || PrevThread == Thread)
{ {
PEPROCESS OldProcess; PEPROCESS OldProcess;
PW32PROCESS W32Process; PW32PROCESS W32Process;
@ -1324,13 +1330,13 @@ LockHandle:
/* dereference the process' object counter */ /* dereference the process' object counter */
/* FIXME */ /* FIXME */
if((ULONG_PTR)PrevProcId & ~0x1) if ((ULONG_PTR)PrevProcId & ~0x1)
{ {
Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess);
if(NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
W32Process = (PW32PROCESS)OldProcess->Win32Process; W32Process = (PW32PROCESS)OldProcess->Win32Process;
if(W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedDecrement(&W32Process->GDIObjects); _InterlockedDecrement(&W32Process->GDIObjects);
} }
@ -1338,13 +1344,13 @@ LockHandle:
} }
} }
if(NewOwner != NULL) if (NewOwner != NULL)
{ {
ProcessId = PsGetProcessId(NewOwner); ProcessId = PsGetProcessId(NewOwner);
/* Increase the new process' object counter */ /* Increase the new process' object counter */
W32Process = (PW32PROCESS)NewOwner->Win32Process; W32Process = (PW32PROCESS)NewOwner->Win32Process;
if(W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedIncrement(&W32Process->GDIObjects); _InterlockedIncrement(&W32Process->GDIObjects);
} }
@ -1361,7 +1367,7 @@ LockHandle:
else else
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread); DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread);
} }
@ -1384,10 +1390,10 @@ LockHandle:
DPRINT1("Entry->Type = 0x%lx, Entry->KernelData = 0x%p\n", Entry->Type, Entry->KernelData); DPRINT1("Entry->Type = 0x%lx, Entry->KernelData = 0x%p\n", Entry->Type, Entry->KernelData);
} }
} }
else if(PrevProcId == LockedProcessId) else if (PrevProcId == LockedProcessId)
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Waiting on 0x%x\n", Attempts, ObjectHandle); DPRINT1("[%d]Waiting on 0x%x\n", Attempts, ObjectHandle);
} }
@ -1398,14 +1404,14 @@ LockHandle:
/* try again */ /* try again */
goto LockHandle; goto LockHandle;
} }
else if(((ULONG_PTR)PrevProcId & ~0x1) == 0) else if (((ULONG_PTR)PrevProcId & ~0x1) == 0)
{ {
/* allow changing ownership of global objects */ /* allow changing ownership of global objects */
ProcessId = NULL; ProcessId = NULL;
LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
goto LockHandle; goto LockHandle;
} }
else if((HANDLE)((ULONG_PTR)PrevProcId & ~0x1) != PsGetCurrentProcessId()) else if ((HANDLE)((ULONG_PTR)PrevProcId & ~0x1) != PsGetCurrentProcessId())
{ {
DPRINT1("Attempted to change ownership of object 0x%x (pid: 0x%x) from pid 0x%x!!!\n", ObjectHandle, (ULONG_PTR)PrevProcId & ~0x1, PsGetCurrentProcessId()); DPRINT1("Attempted to change ownership of object 0x%x (pid: 0x%x) from pid 0x%x!!!\n", ObjectHandle, (ULONG_PTR)PrevProcId & ~0x1, PsGetCurrentProcessId());
} }
@ -1430,7 +1436,7 @@ GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo)
Thread = PsGetCurrentThreadWin32Thread(); Thread = PsGetCurrentThreadWin32Thread();
if(!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo)) if (!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo))
{ {
FromEntry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, CopyFrom); FromEntry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, CopyFrom);
@ -1440,27 +1446,27 @@ GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo)
LockHandleFrom: LockHandleFrom:
/* lock the object, we must not convert stock objects, so don't check!!! */ /* lock the object, we must not convert stock objects, so don't check!!! */
FromPrevProcId = _InterlockedCompareExchangePointer((PVOID*)&FromEntry->ProcessId, FromProcessId, FromLockedProcessId); FromPrevProcId = _InterlockedCompareExchangePointer((PVOID*)&FromEntry->ProcessId, FromProcessId, FromLockedProcessId);
if(FromPrevProcId == FromProcessId) if (FromPrevProcId == FromProcessId)
{ {
PW32THREAD PrevThread; PW32THREAD PrevThread;
POBJ Object; POBJ Object;
if((FromEntry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 && FromEntry->KernelData != NULL) if ((FromEntry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 && FromEntry->KernelData != NULL)
{ {
Object = FromEntry->KernelData; Object = FromEntry->KernelData;
/* save the pointer to the calling thread so we know it was this thread /* save the pointer to the calling thread so we know it was this thread
that locked the object */ that locked the object */
PrevThread = Object->Tid; PrevThread = Object->Tid;
if(Object->cExclusiveLock == 0 || PrevThread == Thread) if (Object->cExclusiveLock == 0 || PrevThread == Thread)
{ {
/* now let's change the ownership of the target object */ /* now let's change the ownership of the target object */
if(((ULONG_PTR)FromPrevProcId & ~0x1) != 0) if (((ULONG_PTR)FromPrevProcId & ~0x1) != 0)
{ {
PEPROCESS ProcessTo; PEPROCESS ProcessTo;
/* FIXME */ /* FIXME */
if(NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1), &ProcessTo))) if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1), &ProcessTo)))
{ {
GDIOBJ_SetOwnership(CopyTo, ProcessTo); GDIOBJ_SetOwnership(CopyTo, ProcessTo);
ObDereferenceObject(ProcessTo); ObDereferenceObject(ProcessTo);
@ -1477,7 +1483,7 @@ LockHandleFrom:
else else
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread); DPRINT1("[%d]Locked by 0x%x (we're 0x%x)\n", Attempts, PrevThread, Thread);
} }
@ -1499,10 +1505,10 @@ LockHandleFrom:
DPRINT1("Attempted to copy ownership from an object 0x%x currently being destroyed!!!\n", CopyFrom); DPRINT1("Attempted to copy ownership from an object 0x%x currently being destroyed!!!\n", CopyFrom);
} }
} }
else if(FromPrevProcId == FromLockedProcessId) else if (FromPrevProcId == FromLockedProcessId)
{ {
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
if(++Attempts > 20) if (++Attempts > 20)
{ {
DPRINT1("[%d]Waiting on 0x%x\n", Attempts, CopyFrom); DPRINT1("[%d]Waiting on 0x%x\n", Attempts, CopyFrom);
} }
@ -1513,7 +1519,7 @@ LockHandleFrom:
/* try again */ /* try again */
goto LockHandleFrom; goto LockHandleFrom;
} }
else if((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1) != PsGetCurrentProcessId()) else if ((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1) != PsGetCurrentProcessId())
{ {
/* FIXME - should we really allow copying ownership from objects that we don't even own? */ /* FIXME - should we really allow copying ownership from objects that we don't even own? */
DPRINT1("WARNING! Changing copying ownership of object 0x%x (pid: 0x%x) to pid 0x%x!!!\n", CopyFrom, (ULONG_PTR)FromPrevProcId & ~0x1, PsGetCurrentProcessId()); DPRINT1("WARNING! Changing copying ownership of object 0x%x (pid: 0x%x) to pid 0x%x!!!\n", CopyFrom, (ULONG_PTR)FromPrevProcId & ~0x1, PsGetCurrentProcessId());
@ -1563,7 +1569,7 @@ HANDLE
APIENTRY APIENTRY
NtGdiCreateClientObj( NtGdiCreateClientObj(
IN ULONG ulType IN ULONG ulType
) )
{ {
// ATM we use DC object for KernelData. I think it should be at a minimum GDIOBJEMPTYHDR. // ATM we use DC object for KernelData. I think it should be at a minimum GDIOBJEMPTYHDR.
// The UserData is set in user mode, so it is always NULL. // The UserData is set in user mode, so it is always NULL.
@ -1588,7 +1594,7 @@ BOOL
APIENTRY APIENTRY
NtGdiDeleteClientObj( NtGdiDeleteClientObj(
IN HANDLE h IN HANDLE h
) )
{ {
return GDIOBJ_FreeObj(h, GDI_OBJECT_TYPE_CLIOBJ); return GDIOBJ_FreeObj(h, GDI_OBJECT_TYPE_CLIOBJ);
} }