2 * GDI object common header definition
8 /* Public GDI Object/Handle definitions */
9 #include <win32k/ntgdihdl.h>
12 typedef struct _GDI_HANDLE_TABLE
14 /* The table must be located at the beginning of this structure so it can be
17 //////////////////////////////////////////////////////////////////////////////
18 GDI_TABLE_ENTRY Entries
[GDI_HANDLE_COUNT
];
19 DEVCAPS DevCaps
; // Device Capabilities.
20 FLONG flDeviceUniq
; // Device settings uniqueness.
21 PVOID pvLangPack
; // Language Pack.
22 CFONT cfPublic
[GDI_CFONT_MAX
]; // Public Fonts.
24 //////////////////////////////////////////////////////////////////////////////
25 PPAGED_LOOKASIDE_LIST LookasideLists
;
30 } GDI_HANDLE_TABLE
, *PGDI_HANDLE_TABLE
;
32 extern PGDI_HANDLE_TABLE GdiHandleTable
;
34 typedef PVOID PGDIOBJ
;
36 typedef BOOL (INTERNAL_CALL
*GDICLEANUPPROC
)(PVOID ObjectBody
);
38 /* Every GDI Object must have this standard type of header.
39 * It's for thread locking. */
40 typedef struct _BASEOBJECT
44 USHORT cExclusiveLock
;
49 typedef struct _CLIENTOBJ
51 BASEOBJECT BaseObject
;
52 } CLIENTOBJ
, *PCLIENTOBJ
;
56 BASEFLAG_LOOKASIDE
= 0x80,
58 /* ReactOS specific: */
59 BASEFLAG_READY_TO_DIE
= 0x1000
62 BOOL INTERNAL_CALL
GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle
);
63 BOOL INTERNAL_CALL
GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle
, PEPROCESS Owner
);
64 BOOL INTERNAL_CALL
GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom
, HGDIOBJ CopyTo
);
65 BOOL INTERNAL_CALL
GDIOBJ_ConvertToStockObj(HGDIOBJ
*hObj
);
66 //VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
67 BOOL INTERNAL_CALL
GDIOBJ_ValidateHandle(HGDIOBJ hObj
, ULONG ObjectType
);
68 POBJ INTERNAL_CALL
GDIOBJ_AllocObj(UCHAR ObjectType
);
69 POBJ INTERNAL_CALL
GDIOBJ_AllocObjWithHandle(ULONG ObjectType
);
70 VOID INTERNAL_CALL
GDIOBJ_FreeObj (POBJ pObj
, UCHAR ObjectType
);
71 BOOL INTERNAL_CALL
GDIOBJ_FreeObjByHandle (HGDIOBJ hObj
, DWORD ObjectType
);
72 PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObj (HGDIOBJ hObj
, DWORD ObjectType
);
73 PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObj (HGDIOBJ hObj
, DWORD ObjectType
);
75 PVOID INTERNAL_CALL
GDI_MapHandleTable(PSECTION_OBJECT SectionObject
, PEPROCESS Process
);
77 #define GDIOBJ_GetObjectType(Handle) \
78 GDI_HANDLE_GET_TYPE(Handle)
80 #define GDIOBJFLAG_DEFAULT (0x0)
81 #define GDIOBJFLAG_IGNOREPID (0x1)
82 #define GDIOBJFLAG_IGNORELOCK (0x2)
84 BOOL FASTCALL
GreDeleteObject(HGDIOBJ hObject
);
85 BOOL FASTCALL
IsObjectDead(HGDIOBJ
);
86 BOOL FASTCALL
IntGdiSetDCOwnerEx( HDC
, DWORD
, BOOL
);
87 BOOL FASTCALL
IntGdiSetRegionOwner(HRGN
,DWORD
);
90 * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
91 * You should unlock the object
92 * as soon as you don't need to have access to it's data.
94 * \param Object Object pointer (as returned by GDIOBJ_LockObj).
98 GDIOBJ_UnlockObjByPtr(POBJ Object
)
100 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->cExclusiveLock
);
107 GDIOBJ_ShareUnlockObjByPtr(POBJ Object
)
109 HGDIOBJ hobj
= Object
->hHmgr
;
110 USHORT flags
= Object
->BaseFlags
;
111 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->ulShareCount
);
113 if ((flags
& BASEFLAG_READY_TO_DIE
) && (cLocks
== 0))
115 GDIOBJ_FreeObjByHandle(hobj
, GDI_OBJECT_TYPE_DONTCARE
);
121 ULONG FASTCALL
GDIOBJ_IncrementShareCount(POBJ Object
);
125 GDIOBJ_IncrementShareCount(POBJ Object
)
127 INT cLocks
= InterlockedIncrement((PLONG
)&Object
->ulShareCount
);
133 INT FASTCALL
GreGetObjectOwner(HGDIOBJ
, GDIOBJTYPE
);
135 #define GDIOBJ_GetKernelObj(Handle) \
136 ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData