don't shift the PIDs of objects so the first bit can be used to lock
objects, as the lower 2 bits of PIDs are now always zero just test and
set this bit
Modified: trunk/reactos/include/win32k/ntuser.h
Modified: trunk/reactos/subsys/win32k/objects/gdiobj.c
_____
Modified: trunk/reactos/include/win32k/ntuser.h
--- trunk/reactos/include/win32k/ntuser.h 2005-01-26 00:12:33 UTC
(rev 13302)
+++ trunk/reactos/include/win32k/ntuser.h 2005-01-26 00:43:24 UTC
(rev 13303)
@@ -1814,7 +1814,7 @@
typedef struct _GDI_TABLE_ENTRY
{
PVOID KernelData; /* Points to the kernel mode structure */
- LONG ProcessId; /* process id that created the object, 0 for stock
objects */
+ HANDLE ProcessId; /* process id that created the object, 0 for stock
objects */
LONG Type; /* the first 16 bit is the object type including
the stock obj flag, the last 16 bits is just the object type */
PVOID UserData; /* Points to the user mode structure, usually NULL
though */
} GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY;
_____
Modified: trunk/reactos/subsys/win32k/objects/gdiobj.c
--- trunk/reactos/subsys/win32k/objects/gdiobj.c 2005-01-26
00:12:33 UTC (rev 13302)
+++ trunk/reactos/subsys/win32k/objects/gdiobj.c 2005-01-26
00:43:24 UTC (rev 13303)
@@ -327,7 +327,7 @@
PW32PROCESS W32Process;
PGDIOBJHDR newObject;
PPAGED_LOOKASIDE_LIST LookasideList;
- LONG CurrentProcessId, LockedProcessId;
+ HANDLE CurrentProcessId, LockedProcessId;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
#endif
@@ -351,11 +351,8 @@
PGDIOBJ ObjectBody;
LONG TypeInfo;
- /* shift the process id to the left so we can use the first bit
to lock
- the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- CurrentProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = CurrentProcessId | 0x1;
+ CurrentProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)CurrentProcessId | 0x1);
newObject->LockingThread = NULL;
newObject->Locks = 0;
@@ -376,7 +373,7 @@
FreeEntry =
InterlockedPopEntrySList(&HandleTable->FreeEntriesHead);
if(FreeEntry != NULL)
{
- LONG PrevProcId;
+ HANDLE PrevProcId;
UINT Index;
HGDIOBJ Handle;
@@ -387,8 +384,8 @@
Handle = (HGDIOBJ)((Index & 0xFFFF) | (ObjectType &
0xFFFF0000));
LockHandle:
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
LockedProcessId, 0);
- if(PrevProcId == 0)
+ PrevProcId =
InterlockedCompareExchangePointer(&Entry->ProcessId, LockedProcessId,
0);
+ if(PrevProcId == NULL)
{
ASSERT(Entry->KernelData == NULL);
@@ -399,7 +396,7 @@
Entry->Type = TypeInfo;
/* unlock the entry */
- InterlockedExchange(&Entry->ProcessId, CurrentProcessId);
+ InterlockedExchangePointer(&Entry->ProcessId,
CurrentProcessId);
#ifdef GDI_DEBUG
memset ( GDIHandleAllocator[Index], 0xcd, GDI_STACK_LEVELS *
sizeof(ULONG) );
@@ -468,7 +465,8 @@
{
PGDI_TABLE_ENTRY Entry;
PPAGED_LOOKASIDE_LIST LookasideList;
- LONG ProcessId, LockedProcessId, PrevProcId, ExpectedType;
+ HANDLE ProcessId, LockedProcessId, PrevProcId;
+ LONG ExpectedType;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
#endif
@@ -484,10 +482,8 @@
return FALSE;
}
- /* shift the process id to the left so we can use the first bit to
lock the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
ExpectedType = ((ObjectType != GDI_OBJECT_TYPE_DONTCARE) ? ObjectType
: 0);
@@ -496,7 +492,7 @@
LockHandle:
/* 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... */
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
LockedProcessId, ProcessId);
+ PrevProcId = InterlockedCompareExchangePointer(&Entry->ProcessId,
LockedProcessId, ProcessId);
if(PrevProcId == ProcessId)
{
if(Entry->Type != 0 && Entry->KernelData != NULL &&
(ExpectedType
== 0 || ((Entry->Type << 16) == ExpectedType)))
@@ -516,7 +512,7 @@
Entry->KernelData = NULL;
/* unlock the handle slot */
- InterlockedExchange(&Entry->ProcessId, 0);
+ InterlockedExchangePointer(&Entry->ProcessId, NULL);
/* push this entry to the free list */
InterlockedPushEntrySList(&HandleTable->FreeEntriesHead,
@@ -546,7 +542,7 @@
Entry->Type = 0;
/* unlock the handle slot */
- InterlockedExchange(&Entry->ProcessId, 0);
+ InterlockedExchangePointer(&Entry->ProcessId, NULL);
/* report a successful deletion as the object is actually
removed from the table */
return TRUE;
@@ -562,7 +558,7 @@
{
DPRINT1("Attempted to delete object 0x%x which was already
deleted!\n", hObj);
}
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
}
}
else if(PrevProcId == LockedProcessId)
@@ -581,13 +577,13 @@
}
else
{
- if((PrevProcId >> 1) == 0)
+ if(((ULONG_PTR)PrevProcId & 0x1) == 0)
{
DPRINT1("Attempted to free global gdi handle 0x%x, caller needs
to get ownership first!!!", hObj);
}
else
{
- DPRINT1("Attempted to free foreign handle: 0x%x Owner: 0x%x from
Caller: 0x%x\n", hObj, PrevProcId >> 1, ProcessId >> 1);
+ DPRINT1("Attempted to free foreign handle: 0x%x Owner: 0x%x from
Caller: 0x%x\n", hObj, (ULONG_PTR)PrevProcId & ~0x1,
(ULONG_PTR)ProcessId & ~0x1);
}
#ifdef GDI_DEBUG
DPRINT1("-> called from %s:%i\n", file, line);
@@ -712,7 +708,7 @@
PGDI_TABLE_ENTRY Entry, End;
PEPROCESS CurrentProcess;
PW32PROCESS W32Process;
- LONG ProcId;
+ HANDLE ProcId;
ULONG Index = RESERVE_ENTRIES_COUNT;
DPRINT("Starting CleanupForProcess prochandle %x Pid %d\n", Process,
Process->UniqueProcessId);
@@ -728,7 +724,7 @@
{
/* FIXME - Instead of building the handle here and delete it using
GDIOBJ_FreeObj
we should delete it directly here! */
- ProcId = ((LONG)Process->UniqueProcessId << 1);
+ ProcId = Process->UniqueProcessId;
End = &HandleTable->Entries[GDI_HANDLE_COUNT];
for(Entry = &HandleTable->Entries[RESERVE_ENTRIES_COUNT];
@@ -736,7 +732,7 @@
Entry++, Index++)
{
/* ignore the lock bit */
- if((Entry->ProcessId & ~0x1) == ProcId && Entry->Type != 0)
+ if((HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcId &&
Entry->Type != 0)
{
HGDIOBJ ObjectHandle;
@@ -785,7 +781,8 @@
{
PGDI_TABLE_ENTRY Entry;
PETHREAD Thread;
- LONG ProcessId, LockedProcessId, PrevProcId, ExpectedType;
+ HANDLE ProcessId, LockedProcessId, PrevProcId;
+ LONG ExpectedType;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
#endif
@@ -794,10 +791,8 @@
Thread = PsGetCurrentThread();
- /* shift the process id to the left so we can use the first bit to
lock the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
ExpectedType = ((ObjectType != GDI_OBJECT_TYPE_DONTCARE) ? ObjectType
: 0);
@@ -805,7 +800,7 @@
LockHandle:
/* lock the object, we must not delete stock objects, so don't
check!!! */
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
LockedProcessId, ProcessId);
+ PrevProcId = InterlockedCompareExchangePointer(&Entry->ProcessId,
LockedProcessId, ProcessId);
if(PrevProcId == ProcessId)
{
LONG EntryType = Entry->Type << 16;
@@ -835,14 +830,14 @@
#endif
}
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
/* we're done, return the object body */
return GDIHdrToBdy(GdiHdr);
}
else
{
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
#ifdef GDI_DEBUG
if(++Attempts > 20)
@@ -857,7 +852,7 @@
}
else
{
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
if(EntryType == 0)
{
@@ -888,17 +883,17 @@
/* try again */
goto LockHandle;
}
- else if((PrevProcId & ~0x1) == 0)
+ else if(((ULONG_PTR)PrevProcId & ~0x1) == 0)
{
/* we're trying to lock a global object, change the ProcessId to 0
and try again */
- ProcessId = 0x0;
- LockedProcessId = ProcessId |0x1;
+ ProcessId = NULL;
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
goto LockHandle;
}
else
{
- DPRINT1("Attempted to lock foreign handle: 0x%x, Owner: 0x%x
locked: 0x%x Caller: 0x%x, stockobj: 0x%x\n", hObj, PrevProcId >> 1,
PrevProcId & 0x1, PsGetCurrentProcessId(),
GDI_HANDLE_IS_STOCKOBJ(hObj));
+ DPRINT1("Attempted to lock foreign handle: 0x%x, Owner: 0x%x
locked: 0x%x Caller: 0x%x, stockobj: 0x%x\n", hObj,
(ULONG_PTR)PrevProcId & ~0x1, (ULONG_PTR)PrevProcId & 0x1,
PsGetCurrentProcessId(), GDI_HANDLE_IS_STOCKOBJ(hObj));
KeRosDumpStackFrames ( NULL, 20 );
#ifdef GDI_DEBUG
DPRINT1("-> called from %s:%i\n", file, line);
@@ -927,7 +922,7 @@
{
PGDI_TABLE_ENTRY Entry;
PETHREAD Thread;
- LONG ProcessId, LockedProcessId, PrevProcId;
+ HANDLE ProcessId, LockedProcessId, PrevProcId;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
#endif
@@ -935,16 +930,14 @@
DPRINT("GDIOBJ_UnlockObj: hObj: 0x%08x\n", hObj);
Thread = PsGetCurrentThread();
- /* shift the process id to the left so we can use the first bit to
lock the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
Entry = GDI_HANDLE_GET_ENTRY(HandleTable, hObj);
LockHandle:
/* lock the handle, we must not delete stock objects, so don't
check!!! */
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
LockedProcessId, ProcessId);
+ PrevProcId = InterlockedCompareExchangePointer(&Entry->ProcessId,
LockedProcessId, ProcessId);
if(PrevProcId == ProcessId)
{
/* we're unlocking an object that belongs to our process or it's a
global
@@ -982,7 +975,7 @@
/* we should delete the handle */
Entry->KernelData = NULL;
- InterlockedExchange(&Entry->ProcessId, 0);
+ InterlockedExchangePointer(&Entry->ProcessId, 0);
InterlockedPushEntrySList(&HandleTable->FreeEntriesHead,
&HandleTable->FreeEntries[GDI_ENTRY_TO_INDEX(HandleTable, Entry)]);
@@ -1005,7 +998,7 @@
else
{
/* remove the handle slot lock */
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
Ret = TRUE;
}
@@ -1017,7 +1010,7 @@
{
DPRINT1("Attempted to unlock object 0x%x, previously locked by
other thread (0x%x) from %s:%i (called from %s:%i)\n",
hObj, PrevThread, GdiHdr->lockfile, GdiHdr->lockline,
file, line);
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
}
#endif
else
@@ -1029,7 +1022,7 @@
}
#endif
/* FIXME - we should give up after some time unless we want to
wait forever! */
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
DelayExecution();
goto LockHandle;
@@ -1037,7 +1030,7 @@
}
else
{
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
DPRINT1("Attempted to unlock object 0x%x that is deleted!\n",
hObj);
}
}
@@ -1055,17 +1048,17 @@
/* try again */
goto LockHandle;
}
- else if((PrevProcId & ~0x1) == 0)
+ else if(((ULONG_PTR)PrevProcId & ~0x1) == 0)
{
/* we're trying to unlock a global object, change the ProcessId to
0 and try again */
- ProcessId = 0x0;
- LockedProcessId = ProcessId |0x1;
+ ProcessId = NULL;
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
goto LockHandle;
}
else
{
- DPRINT1("Attempted to unlock foreign handle: 0x%x, Owner: 0x%x
locked: 0x%x Caller: 0x%x, stockobj: 0x%x\n", hObj, PrevProcId >> 1,
PrevProcId & 0x1, PsGetCurrentProcessId(),
GDI_HANDLE_IS_STOCKOBJ(hObj));
+ DPRINT1("Attempted to unlock foreign handle: 0x%x, Owner: 0x%x
locked: 0x%x Caller: 0x%x, stockobj: 0x%x\n", hObj,
(ULONG_PTR)PrevProcId & ~0x1, (ULONG_PTR)PrevProcId & 0x1,
PsGetCurrentProcessId(), GDI_HANDLE_IS_STOCKOBJ(hObj));
}
return FALSE;
@@ -1075,19 +1068,19 @@
GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle)
{
PGDI_TABLE_ENTRY Entry;
- LONG ProcessId;
+ HANDLE ProcessId;
BOOL Ret;
DPRINT("GDIOBJ_OwnedByCurrentProcess: ObjectHandle: 0x%08x\n",
ObjectHandle);
if(!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle))
{
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
+ ProcessId = PsGetCurrentProcessId();
Entry = GDI_HANDLE_GET_ENTRY(HandleTable, ObjectHandle);
Ret = Entry->KernelData != NULL &&
Entry->Type != 0 &&
- (Entry->ProcessId & ~0x1) == ProcessId;
+ (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcessId;
return Ret;
}
@@ -1103,7 +1096,7 @@
* MIGHT ATTEMPT TO LOCK THE OBJECT DURING THIS CALL!!!
*/
PGDI_TABLE_ENTRY Entry;
- LONG ProcessId, LockedProcessId, PrevProcId;
+ HANDLE ProcessId, LockedProcessId, PrevProcId;
PETHREAD Thread;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
@@ -1117,16 +1110,14 @@
if(!GDI_HANDLE_IS_STOCKOBJ(*hObj))
{
- /* shift the process id to the left so we can use the first bit to
lock the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
Entry = GDI_HANDLE_GET_ENTRY(HandleTable, *hObj);
LockHandle:
/* lock the object, we must not convert stock objects, so don't
check!!! */
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
LockedProcessId, ProcessId);
+ PrevProcId = InterlockedCompareExchangePointer(&Entry->ProcessId,
LockedProcessId, ProcessId);
if(PrevProcId == ProcessId)
{
LONG NewType, PrevType, OldType;
@@ -1165,7 +1156,7 @@
NTSTATUS Status;
/* FIXME */
- Status = PsLookupProcessByProcessId((PVOID)(PrevProcId >>
1), &OldProcess);
+ Status =
PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1),
&OldProcess);
if(NT_SUCCESS(Status))
{
W32Process = OldProcess->Win32Process;
@@ -1178,7 +1169,7 @@
}
/* remove the process id lock and make it global */
- InterlockedExchange(&Entry->ProcessId, GDI_GLOBAL_PROCESS);
+ InterlockedExchangePointer(&Entry->ProcessId,
GDI_GLOBAL_PROCESS);
*hObj = (HGDIOBJ)((ULONG)(*hObj) | GDI_HANDLE_STOCK_MASK);
@@ -1199,7 +1190,7 @@
/* WTF?! The object is already locked by a different thread!
Release the lock, wait a bit and try again!
FIXME - we should give up after some time unless we want
to wait forever! */
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
DelayExecution();
goto LockHandle;
@@ -1237,7 +1228,7 @@
GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner)
{
PGDI_TABLE_ENTRY Entry;
- LONG ProcessId, LockedProcessId, PrevProcId;
+ HANDLE ProcessId, LockedProcessId, PrevProcId;
PETHREAD Thread;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
@@ -1249,16 +1240,14 @@
if(!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle))
{
- /* shift the process id to the left so we can use the first bit to
lock the object.
- FIXME - don't shift once ROS' PIDs match with nt! */
- ProcessId = (LONG)PsGetCurrentProcessId() << 1;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = PsGetCurrentProcessId();
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
Entry = GDI_HANDLE_GET_ENTRY(HandleTable, ObjectHandle);
LockHandle:
/* lock the object, we must not convert stock objects, so don't
check!!! */
- PrevProcId = InterlockedCompareExchange(&Entry->ProcessId,
ProcessId, LockedProcessId);
+ PrevProcId = InterlockedCompareExchangePointer(&Entry->ProcessId,
ProcessId, LockedProcessId);
if(PrevProcId == ProcessId)
{
PETHREAD PrevThread;
@@ -1276,7 +1265,7 @@
/* dereference the process' object counter */
/* FIXME */
- Status = PsLookupProcessByProcessId((PVOID)(PrevProcId >> 1),
&OldProcess);
+ Status =
PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1),
&OldProcess);
if(NT_SUCCESS(Status))
{
W32Process = OldProcess->Win32Process;
@@ -1289,8 +1278,7 @@
if(NewOwner != NULL)
{
- /* FIXME */
- ProcessId = (LONG)PsGetProcessId(NewOwner) << 1;
+ ProcessId = PsGetProcessId(NewOwner);
/* Increase the new process' object counter */
W32Process = NewOwner->Win32Process;
@@ -1303,7 +1291,7 @@
ProcessId = 0;
/* remove the process id lock and change it to the new
process id */
- InterlockedExchange(&Entry->ProcessId, ProcessId);
+ InterlockedExchangePointer(&Entry->ProcessId, ProcessId);
/* we're done! */
return;
@@ -1325,7 +1313,7 @@
being deleted in the meantime (because we don't have
aquired a reference
at this point).
FIXME - we should give up after some time unless we want
to wait forever! */
- InterlockedExchange(&Entry->ProcessId, PrevProcId);
+ InterlockedExchangePointer(&Entry->ProcessId, PrevProcId);
DelayExecution();
goto LockHandle;
@@ -1350,16 +1338,16 @@
/* try again */
goto LockHandle;
}
- else if((PrevProcId >> 1) == 0)
+ else if(((ULONG_PTR)PrevProcId & ~0x1) == 0)
{
/* allow changing ownership of global objects */
- ProcessId = 0;
- LockedProcessId = ProcessId | 0x1;
+ ProcessId = NULL;
+ LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1);
goto LockHandle;
}
- else if((PrevProcId >> 1) != (LONG)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, PrevProcId >> 1,
PsGetCurrentProcessId());
+ DPRINT1("Attempted to change ownership of object 0x%x (pid: 0x%x)
from pid 0x%x!!!\n", ObjectHandle, (ULONG_PTR)PrevProcId & ~0x1,
PsGetCurrentProcessId());
}
else
{
@@ -1373,7 +1361,7 @@
{
PGDI_TABLE_ENTRY FromEntry;
PETHREAD Thread;
- LONG FromProcessId, FromLockedProcessId, FromPrevProcId;
+ HANDLE FromProcessId, FromLockedProcessId, FromPrevProcId;
#ifdef GDI_DEBUG
ULONG Attempts = 0;
#endif
@@ -1386,12 +1374,12 @@
{
FromEntry = GDI_HANDLE_GET_ENTRY(HandleTable, CopyFrom);
- FromProcessId = FromEntry->ProcessId & ~0x1;
- FromLockedProcessId = FromProcessId | 0x1;
+ FromProcessId = (HANDLE)((ULONG_PTR)FromEntry->ProcessId & ~0x1);
+ FromLockedProcessId = (HANDLE)((ULONG_PTR)FromProcessId | 0x1);
LockHandleFrom:
/* lock the object, we must not convert stock objects, so don't
check!!! */
- FromPrevProcId = InterlockedCompareExchange(&FromEntry->ProcessId,
FromProcessId, FromLockedProcessId);
+ FromPrevProcId =
InterlockedCompareExchangePointer(&FromEntry->ProcessId, FromProcessId,
FromLockedProcessId);
if(FromPrevProcId == FromProcessId)
{
PETHREAD PrevThread;
@@ -1408,11 +1396,11 @@
{
/* now let's change the ownership of the target object */
- if((FromPrevProcId & ~0x1) != 0)
+ if(((ULONG_PTR)FromPrevProcId & ~0x1) != 0)
{
PEPROCESS ProcessTo;
/* FIXME */
-
if(NT_SUCCESS(PsLookupProcessByProcessId((PVOID)(FromPrevProcId >> 1),
&ProcessTo)))
+
if(NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)FromPrevPro
cId & ~0x1), &ProcessTo)))
{
GDIOBJ_SetOwnership(CopyTo, ProcessTo);
ObDereferenceObject(ProcessTo);
@@ -1424,7 +1412,7 @@
GDIOBJ_SetOwnership(CopyTo, NULL);
}
- InterlockedExchange(&FromEntry->ProcessId, FromPrevProcId);
+ InterlockedExchangePointer(&FromEntry->ProcessId,
FromPrevProcId);
}
else
{
@@ -1443,7 +1431,7 @@
being deleted in the meantime (because we don't have
aquired a reference
at this point).
FIXME - we should give up after some time unless we want
to wait forever! */
- InterlockedExchange(&FromEntry->ProcessId, FromPrevProcId);
+ InterlockedExchangePointer(&FromEntry->ProcessId,
FromPrevProcId);
DelayExecution();
goto LockHandleFrom;
@@ -1468,12 +1456,12 @@
/* try again */
goto LockHandleFrom;
}
- else if((FromPrevProcId >> 1) != (LONG)PsGetCurrentProcessId())
+ else if((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1) !=
PsGetCurrentProcessId())
{
/* 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, FromPrevProcId >> 1,
PsGetCurrentProcessId());
- FromProcessId = FromPrevProcId & ~0x1;
- FromLockedProcessId = FromProcessId | 0x1;
+ DPRINT1("WARNING! Changing copying ownership of object 0x%x (pid:
0x%x) to pid 0x%x!!!\n", CopyFrom, (ULONG_PTR)FromPrevProcId & ~0x1,
PsGetCurrentProcessId());
+ FromProcessId = (HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1);
+ FromLockedProcessId = (HANDLE)((ULONG_PTR)FromProcessId | 0x1);
goto LockHandleFrom;
}
else