/*
* GDIOBJ.C - GDI object manipulation routines
*
- * $Id: gdiobj.c,v 1.44 2003/09/26 10:45:45 gvg Exp $
+ * $Id: gdiobj.c,v 1.46 2003/10/15 03:09:23 vizzini Exp $
*
*/
#define GDI_VALID_OBJECT(h, obj, t, f) \
(NULL != (obj) \
&& (GDI_MAGIC_TO_TYPE((obj)->Magic) == (t) || GDI_OBJECT_TYPE_DONTCARE == (t)) \
- && (GDI_HANDLE_GET_TYPE((h)) == (t) || GDI_OBJECT_TYPE_DONTCARE == (t)) \
+ && (GDI_HANDLE_GET_TYPE((h)) == GDI_MAGIC_TO_TYPE((obj)->Magic)) \
&& (((obj)->hProcessId == PsGetCurrentProcessId()) \
|| (GDI_GLOBAL_PROCESS == (obj)->hProcessId) \
|| ((f) & GDIOBJFLAG_IGNOREPID)))
GDIOBJ_iAllocHandleTable (WORD Size)
{
PGDI_HANDLE_TABLE handleTable;
+ KIRQL OldIrql;
+ BOOLEAN IrqlRaised = FALSE;
+
+ if(KeGetCurrentIrql() < APC_LEVEL)
+ {
+ KeRaiseIrql(APC_LEVEL, &OldIrql);
+ IrqlRaised = TRUE;
+ }
ExAcquireFastMutexUnsafe (&HandleTableMutex);
handleTable = ExAllocatePool(PagedPool,
handleTable->wTableSize = Size;
ExReleaseFastMutexUnsafe (&HandleTableMutex);
+ if(IrqlRaised)
+ KeLowerIrql(OldIrql);
+
return handleTable;
}
GDIOBJ_iGetNextOpenHandleIndex (void)
{
WORD tableIndex;
+ BOOLEAN IrqlRaised = FALSE;
+ KIRQL OldIrql;
+
+ if(KeGetCurrentIrql() < APC_LEVEL)
+ {
+ KeRaiseIrql(APC_LEVEL, &OldIrql);
+ IrqlRaised = TRUE;
+ }
ExAcquireFastMutexUnsafe (&HandleTableMutex);
for (tableIndex = 1; tableIndex < HandleTable->wTableSize; tableIndex++)
}
ExReleaseFastMutexUnsafe (&HandleTableMutex);
+ if(IrqlRaised)
+ KeLowerIrql(OldIrql);
+
return (tableIndex < HandleTable->wTableSize) ? tableIndex : 0;
}
PGDIOBJHDR ObjHdr;
ObjHdr = GDIOBJ_iGetObjectForIndex(GDI_HANDLE_GET_INDEX(ObjectHandle));
- if (NULL == ObjHdr)
+ if (NULL == ObjHdr
+ || ! GDI_VALID_OBJECT(ObjectHandle, ObjHdr, GDI_MAGIC_TO_TYPE(ObjHdr->Magic), 0))
{
DPRINT1("Invalid ObjectHandle 0x%08x\n", ObjectHandle);
return 0;
(INT) objectHeader->hProcessId == Pid)
{
DPRINT("CleanupForProcess: %d, process: %d, locks: %d, magic: 0x%x", i, objectHeader->hProcessId, objectHeader->dwCount, objectHeader->Magic);
- GDIOBJ_FreeObj(GDI_HANDLE_CREATE(i, GDI_OBJECT_TYPE_DONTCARE),
- GDI_OBJECT_TYPE_DONTCARE,
+ GDIOBJ_FreeObj(GDI_HANDLE_CREATE(i, GDI_MAGIC_TO_TYPE(objectHeader->Magic)),
+ GDI_MAGIC_TO_TYPE(objectHeader->Magic),
GDIOBJFLAG_IGNOREPID | GDIOBJFLAG_IGNORELOCK);
}
}