[WIN32K]
[reactos.git] / reactos / subsystems / win32 / win32k / include / gdiobj.h
1 /*
2 * GDI object common header definition
3 *
4 */
5
6 #pragma once
7
8 /* Public GDI Object/Handle definitions */
9 #include <win32k/ntgdihdl.h>
10 #include "win32.h"
11
12 typedef struct _GDI_HANDLE_TABLE
13 {
14 /* The table must be located at the beginning of this structure so it can be
15 * properly mapped!
16 */
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.
23 DWORD dwCFCount;
24 //////////////////////////////////////////////////////////////////////////////
25 PPAGED_LOOKASIDE_LIST LookasideLists;
26
27 ULONG FirstFree;
28 ULONG FirstUnused;
29
30 } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE;
31
32 extern PGDI_HANDLE_TABLE GdiHandleTable;
33
34 typedef PVOID PGDIOBJ;
35
36 typedef BOOL (INTERNAL_CALL *GDICLEANUPPROC)(PVOID ObjectBody);
37
38 /* Every GDI Object must have this standard type of header.
39 * It's for thread locking. */
40 typedef struct _BASEOBJECT
41 {
42 HGDIOBJ hHmgr;
43 ULONG ulShareCount;
44 USHORT cExclusiveLock;
45 USHORT BaseFlags;
46 PTHREADINFO Tid;
47 } BASEOBJECT, *POBJ;
48
49 typedef struct _CLIENTOBJ
50 {
51 BASEOBJECT BaseObject;
52 } CLIENTOBJ, *PCLIENTOBJ;
53
54 enum BASEFLAGS
55 {
56 BASEFLAG_LOOKASIDE = 0x80,
57
58 /* ReactOS specific: */
59 BASEFLAG_READY_TO_DIE = 0x1000
60 };
61
62 extern PSECTION_OBJECT GdiTableSection;
63
64 BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
65 BOOL INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
66 BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
67 BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
68 //VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
69 BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
70 POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
71 POBJ INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType);
72 VOID INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType);
73 BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
74 PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
75 PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType);
76 VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj);
77
78 PVOID INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process);
79
80 INIT_FUNCTION
81 NTSTATUS
82 NTAPI
83 InitGdiHandleTable();
84
85 #define GDIOBJ_GetObjectType(Handle) \
86 GDI_HANDLE_GET_TYPE(Handle)
87
88 #define GDIOBJFLAG_DEFAULT (0x0)
89 #define GDIOBJFLAG_IGNOREPID (0x1)
90 #define GDIOBJFLAG_IGNORELOCK (0x2)
91
92 BOOL FASTCALL GreDeleteObject(HGDIOBJ hObject);
93 BOOL FASTCALL IsObjectDead(HGDIOBJ);
94 BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
95 BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD);
96
97 /*!
98 * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
99 * You should unlock the object
100 * as soon as you don't need to have access to it's data.
101
102 * \param Object Object pointer (as returned by GDIOBJ_LockObj).
103 */
104 ULONG
105 FORCEINLINE
106 GDIOBJ_UnlockObjByPtr(POBJ Object)
107 {
108 INT cLocks = InterlockedDecrement((PLONG)&Object->cExclusiveLock);
109 ASSERT(cLocks >= 0);
110 return cLocks;
111 }
112
113 ULONG
114 FORCEINLINE
115 GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
116 {
117 HGDIOBJ hobj = Object->hHmgr;
118 USHORT flags = Object->BaseFlags;
119 INT cLocks = InterlockedDecrement((PLONG)&Object->ulShareCount);
120 ASSERT(cLocks >= 0);
121 if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0))
122 {
123 GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess());
124 GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE);
125 }
126 return cLocks;
127 }
128
129 #ifdef GDI_DEBUG
130 ULONG FASTCALL GDIOBJ_IncrementShareCount(POBJ Object);
131 #else
132 ULONG
133 FORCEINLINE
134 GDIOBJ_IncrementShareCount(POBJ Object)
135 {
136 INT cLocks = InterlockedIncrement((PLONG)&Object->ulShareCount);
137 ASSERT(cLocks >= 1);
138 return cLocks;
139 }
140 #endif
141
142 INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
143
144 #define GDIOBJ_GetKernelObj(Handle) \
145 ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData