2 * GDI object common header definition
8 /* Public GDI Object/Handle definitions */
9 #include <win32k/ntgdihdl.h>
12 /* apparently the first 10 entries are never used in windows as they are empty */
13 #define RESERVE_ENTRIES_COUNT 10
15 typedef struct _GDI_HANDLE_TABLE
17 /* The table must be located at the beginning of this structure so it can be
20 //////////////////////////////////////////////////////////////////////////////
21 GDI_TABLE_ENTRY Entries
[GDI_HANDLE_COUNT
];
22 DEVCAPS DevCaps
; // Device Capabilities.
23 FLONG flDeviceUniq
; // Device settings uniqueness.
24 PVOID pvLangPack
; // Language Pack.
25 CFONT cfPublic
[GDI_CFONT_MAX
]; // Public Fonts.
27 //////////////////////////////////////////////////////////////////////////////
28 PPAGED_LOOKASIDE_LIST LookasideLists
;
33 } GDI_HANDLE_TABLE
, *PGDI_HANDLE_TABLE
;
35 extern PGDI_HANDLE_TABLE GdiHandleTable
;
37 typedef PVOID PGDIOBJ
;
39 typedef BOOL (INTERNAL_CALL
*GDICLEANUPPROC
)(PVOID ObjectBody
);
41 /* Every GDI Object must have this standard type of header.
42 * It's for thread locking. */
43 typedef struct _BASEOBJECT
47 USHORT cExclusiveLock
;
50 EX_PUSH_LOCK pushlock
;
53 typedef struct _CLIENTOBJ
55 BASEOBJECT BaseObject
;
56 } CLIENTOBJ
, *PCLIENTOBJ
;
60 BASEFLAG_LOOKASIDE
= 0x80,
62 /* ReactOS specific: */
63 BASEFLAG_READY_TO_DIE
= 0x1000
66 BOOL INTERNAL_CALL
GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle
);
67 BOOL INTERNAL_CALL
GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle
, PEPROCESS Owner
);
68 BOOL INTERNAL_CALL
GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom
, HGDIOBJ CopyTo
);
69 BOOL INTERNAL_CALL
GDIOBJ_ConvertToStockObj(HGDIOBJ
*hObj
);
70 //VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
71 BOOL INTERNAL_CALL
GDIOBJ_ValidateHandle(HGDIOBJ hObj
, ULONG ObjectType
);
72 POBJ INTERNAL_CALL
GDIOBJ_AllocObj(UCHAR ObjectType
);
73 POBJ INTERNAL_CALL
GDIOBJ_AllocObjWithHandle(ULONG ObjectType
);
74 VOID INTERNAL_CALL
GDIOBJ_FreeObj (POBJ pObj
, UCHAR ObjectType
);
75 BOOL INTERNAL_CALL
GDIOBJ_FreeObjByHandle (HGDIOBJ hObj
, DWORD ObjectType
);
76 PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObj (HGDIOBJ hObj
, DWORD ObjectType
);
77 PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObj (HGDIOBJ hObj
, DWORD ObjectType
);
78 VOID INTERNAL_CALL
GDIOBJ_LockMultipleObjs(ULONG ulCount
, IN HGDIOBJ
* ahObj
, OUT PGDIOBJ
* apObj
);
80 PVOID INTERNAL_CALL
GDI_MapHandleTable(PEPROCESS Process
);
85 InitGdiHandleTable(VOID
);
87 #define GDIOBJ_GetObjectType(Handle) \
88 GDI_HANDLE_GET_TYPE(Handle)
90 #define GDIOBJFLAG_DEFAULT (0x0)
91 #define GDIOBJFLAG_IGNOREPID (0x1)
92 #define GDIOBJFLAG_IGNORELOCK (0x2)
94 BOOL FASTCALL
GreDeleteObject(HGDIOBJ hObject
);
95 BOOL FASTCALL
IsObjectDead(HGDIOBJ
);
96 BOOL FASTCALL
IntGdiSetDCOwnerEx( HDC
, DWORD
, BOOL
);
97 BOOL FASTCALL
IntGdiSetRegionOwner(HRGN
,DWORD
);
100 * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
101 * You should unlock the object
102 * as soon as you don't need to have access to it's data.
104 * \param Object Object pointer (as returned by GDIOBJ_LockObj).
108 GDIOBJ_UnlockObjByPtr(POBJ Object
)
111 PTHREADINFO pti
= (PTHREADINFO
)PsGetCurrentThreadWin32Thread();
114 if (pti
->cExclusiveLocks
< 1)
116 DbgPrint("cExclusiveLocks = %ld, object: %ld\n",
117 pti
->cExclusiveLocks
, Object
->cExclusiveLock
);
120 pti
->cExclusiveLocks
--;
123 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->cExclusiveLock
);
130 GDIOBJ_ShareUnlockObjByPtr(POBJ Object
)
132 HGDIOBJ hobj
= Object
->hHmgr
;
133 USHORT flags
= Object
->BaseFlags
;
134 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->ulShareCount
);
136 if ((flags
& BASEFLAG_READY_TO_DIE
) && (cLocks
== 0))
138 ASSERT(Object
->cExclusiveLock
== 0);
139 GDIOBJ_SetOwnership(hobj
, PsGetCurrentProcess());
140 GDIOBJ_FreeObjByHandle(hobj
, GDI_OBJECT_TYPE_DONTCARE
);
146 ULONG FASTCALL
GDIOBJ_IncrementShareCount(POBJ Object
);
150 GDIOBJ_IncrementShareCount(POBJ Object
)
152 INT cLocks
= InterlockedIncrement((PLONG
)&Object
->ulShareCount
);
158 INT FASTCALL
GreGetObjectOwner(HGDIOBJ
, GDIOBJTYPE
);
160 #define GDIOBJ_GetKernelObj(Handle) \
161 ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData
162 #define GDI_ENTRY_TO_INDEX(ht, e) \
163 (((ULONG_PTR)(e) - (ULONG_PTR)&((ht)->Entries[0])) / sizeof(GDI_TABLE_ENTRY))
164 #define GDI_HANDLE_GET_ENTRY(HandleTable, h) \
165 (&(HandleTable)->Entries[GDI_HANDLE_GET_INDEX((h))])