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
);
37 typedef VOID (INTERNAL_CALL
*GDILOCKOBJPROC
)(PVOID ObjectBody
);
39 /* Every GDI Object must have this standard type of header.
40 * It's for thread locking. */
41 typedef struct _BASEOBJECT
45 USHORT cExclusiveLock
;
50 typedef struct _CLIENTOBJ
52 BASEOBJECT BaseObject
;
53 } CLIENTOBJ
, *PCLIENTOBJ
;
57 BASEFLAG_LOOKASIDE
= 0x80,
59 /* ReactOS specific: */
60 BASEFLAG_READY_TO_DIE
= 0x1000
63 BOOL INTERNAL_CALL
GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle
);
64 BOOL INTERNAL_CALL
GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle
, PEPROCESS Owner
);
65 BOOL INTERNAL_CALL
GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom
, HGDIOBJ CopyTo
);
66 BOOL INTERNAL_CALL
GDIOBJ_ConvertToStockObj(HGDIOBJ
*hObj
);
67 //VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
68 BOOL INTERNAL_CALL
GDIOBJ_ValidateHandle(HGDIOBJ hObj
, ULONG ObjectType
);
69 POBJ INTERNAL_CALL
GDIOBJ_AllocObj(UCHAR ObjectType
);
70 POBJ INTERNAL_CALL
GDIOBJ_AllocObjWithHandle(ULONG ObjectType
);
71 VOID INTERNAL_CALL
GDIOBJ_FreeObj (POBJ pObj
, UCHAR ObjectType
);
72 BOOL INTERNAL_CALL
GDIOBJ_FreeObjByHandle (HGDIOBJ hObj
, DWORD ObjectType
);
73 PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObj (HGDIOBJ hObj
, DWORD ObjectType
);
74 PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObj (HGDIOBJ hObj
, DWORD ObjectType
);
75 VOID INTERNAL_CALL
GDIOBJ_LockMultipleObjs(ULONG ulCount
, IN HGDIOBJ
* ahObj
, OUT PGDIOBJ
* apObj
);
77 PVOID INTERNAL_CALL
GDI_MapHandleTable(PSECTION_OBJECT SectionObject
, PEPROCESS Process
);
79 #define GDIOBJ_GetObjectType(Handle) \
80 GDI_HANDLE_GET_TYPE(Handle)
82 #define GDIOBJFLAG_DEFAULT (0x0)
83 #define GDIOBJFLAG_IGNOREPID (0x1)
84 #define GDIOBJFLAG_IGNORELOCK (0x2)
86 BOOL FASTCALL
GreDeleteObject(HGDIOBJ hObject
);
87 BOOL FASTCALL
IsObjectDead(HGDIOBJ
);
88 BOOL FASTCALL
IntGdiSetDCOwnerEx( HDC
, DWORD
, BOOL
);
89 BOOL FASTCALL
IntGdiSetRegionOwner(HRGN
,DWORD
);
92 * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
93 * You should unlock the object
94 * as soon as you don't need to have access to it's data.
96 * \param Object Object pointer (as returned by GDIOBJ_LockObj).
100 GDIOBJ_UnlockObjByPtr(POBJ Object
)
102 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->cExclusiveLock
);
109 GDIOBJ_ShareUnlockObjByPtr(POBJ Object
)
111 HGDIOBJ hobj
= Object
->hHmgr
;
112 USHORT flags
= Object
->BaseFlags
;
113 INT cLocks
= InterlockedDecrement((PLONG
)&Object
->ulShareCount
);
115 if ((flags
& BASEFLAG_READY_TO_DIE
) && (cLocks
== 0))
117 GDIOBJ_FreeObjByHandle(hobj
, GDI_OBJECT_TYPE_DONTCARE
);
123 ULONG FASTCALL
GDIOBJ_IncrementShareCount(POBJ Object
);
127 GDIOBJ_IncrementShareCount(POBJ Object
)
129 INT cLocks
= InterlockedIncrement((PLONG
)&Object
->ulShareCount
);
135 INT FASTCALL
GreGetObjectOwner(HGDIOBJ
, GDIOBJTYPE
);