*
*/
-#ifndef __WIN32K_GDIOBJ_H
-#define __WIN32K_GDIOBJ_H
+#pragma once
/* Public GDI Object/Handle definitions */
#include <win32k/ntgdihdl.h>
ULONG ulShareCount;
USHORT cExclusiveLock;
USHORT BaseFlags;
- PW32THREAD Tid;
+ PTHREADINFO Tid;
} BASEOBJECT, *POBJ;
typedef struct _CLIENTOBJ
enum BASEFLAGS
{
- BASEFLAG_LOOKASIDE = 0x80
+ BASEFLAG_LOOKASIDE = 0x80,
+
+ /* ReactOS specific: */
+ BASEFLAG_READY_TO_DIE = 0x1000
};
BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType);
+VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj);
PVOID INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process);
#define GDIOBJFLAG_IGNOREPID (0x1)
#define GDIOBJFLAG_IGNORELOCK (0x2)
-BOOL FASTCALL NtGdiDeleteObject(HGDIOBJ hObject);
-BOOL FASTCALL IsObjectDead(HGDIOBJ);
-BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
+BOOL FASTCALL GreDeleteObject(HGDIOBJ hObject);
+BOOL FASTCALL IsObjectDead(HGDIOBJ);
+BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
+BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD);
/*!
- * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
+ * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
* You should unlock the object
* as soon as you don't need to have access to it's data.
FORCEINLINE
GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
{
+ HGDIOBJ hobj = Object->hHmgr;
+ USHORT flags = Object->BaseFlags;
INT cLocks = InterlockedDecrement((PLONG)&Object->ulShareCount);
ASSERT(cLocks >= 0);
+ if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0))
+ {
+ GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess());
+ GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE);
+ }
return cLocks;
}
}
#endif
-#endif
+INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
+
+#define GDIOBJ_GetKernelObj(Handle) \
+ ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData