1 /* 2 * GDI object common header definition 3 * 4 */ 5 6 #pragma once 7 8 #define GDI_OBJECT_STACK_LEVELS 20 9 10 /* The first 10 entries are never used in windows, they are empty */ 11 static const unsigned RESERVE_ENTRIES_COUNT = 10; 12 13 typedef struct _GDI_HANDLE_TABLE 14 { 15 /* The table must be located at the beginning of this structure so it can be 16 * properly mapped! 17 */ 18 ////////////////////////////////////////////////////////////////////////////// 19 GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT]; 20 DEVCAPS DevCaps; // Device Capabilities. 21 FLONG flDeviceUniq; // Device settings uniqueness. 22 PVOID pvLangPack; // Language Pack. 23 CFONT cfPublic[GDI_CFONT_MAX]; // Public Fonts. 24 DWORD dwCFCount; 25 26 27 } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE; 28 29 extern PGDI_HANDLE_TABLE GdiHandleTable; 30 31 typedef PVOID PGDIOBJ; 32 33 typedef VOID (NTAPI *GDICLEANUPPROC)(PVOID ObjectBody); 34 typedef VOID (NTAPI *GDIOBJDELETEPROC)(PVOID ObjectBody); 35 36 /* Every GDI Object must have this standard type of header. 37 * It's for thread locking. */ 38 typedef struct _BASEOBJECT 39 { 40 HGDIOBJ hHmgr; 41 union { 42 ULONG ulShareCount; /* For objects without a handle */ 43 DWORD dwThreadId; /* Exclusive lock owner */ 44 }; 45 USHORT cExclusiveLock; 46 USHORT BaseFlags; 47 EX_PUSH_LOCK pushlock; 48 #if DBG_ENABLE_GDIOBJ_BACKTRACES 49 PVOID apvBackTrace[GDI_OBJECT_STACK_LEVELS]; 50 #endif 51 #if DBG_ENABLE_EVENT_LOGGING 52 SLIST_HEADER slhLog; 53 #endif 54 } BASEOBJECT, *POBJ; 55 56 enum BASEFLAGS 57 { 58 BASEFLAG_LOOKASIDE = 0x80, 59 60 /* ReactOS specific: */ 61 BASEFLAG_READY_TO_DIE = 0x1000 62 }; 63 64 typedef struct _CLIENTOBJ 65 { 66 BASEOBJECT BaseObject; 67 } CLIENTOBJ, *PCLIENTOBJ; 68 69 enum _GDIOBJLAGS 70 { 71 GDIOBJFLAG_DEFAULT = 0x00, 72 GDIOBJFLAG_IGNOREPID = 0x01, 73 GDIOBJFLAG_IGNORELOCK = 0x02 74 }; 75 76 NTSTATUS 77 NTAPI 78 InitGdiHandleTable(VOID); 79 80 BOOL 81 NTAPI 82 GreIsHandleValid( 83 HGDIOBJ hobj); 84 85 BOOL 86 NTAPI 87 GreDeleteObject( 88 HGDIOBJ hObject); 89 90 ULONG 91 NTAPI 92 GreGetObjectOwner( 93 HGDIOBJ hobj); 94 95 BOOL 96 NTAPI 97 GreSetObjectOwner( 98 HGDIOBJ hobj, 99 ULONG ulOwner); 100 101 BOOL 102 NTAPI 103 GreSetObjectOwnerEx( 104 HGDIOBJ hobj, 105 ULONG ulOwner, 106 ULONG Flags); 107 108 INT 109 NTAPI 110 GreGetObject( 111 IN HGDIOBJ hobj, 112 IN INT cbCount, 113 OUT PVOID pvBuffer); 114 115 POBJ 116 NTAPI 117 GDIOBJ_AllocateObject( 118 UCHAR objt, 119 ULONG cjSize, 120 FLONG fl); 121 122 VOID 123 NTAPI 124 GDIOBJ_vDeleteObject( 125 POBJ pobj); 126 127 POBJ 128 NTAPI 129 GDIOBJ_ReferenceObjectByHandle( 130 HGDIOBJ hobj, 131 UCHAR objt); 132 133 VOID 134 NTAPI 135 GDIOBJ_vReferenceObjectByPointer( 136 POBJ pobj); 137 138 VOID 139 NTAPI 140 GDIOBJ_vDereferenceObject( 141 POBJ pobj); 142 143 PGDIOBJ 144 NTAPI 145 GDIOBJ_LockObject( 146 HGDIOBJ hobj, 147 UCHAR objt); 148 149 PGDIOBJ 150 NTAPI 151 GDIOBJ_TryLockObject( 152 HGDIOBJ hobj, 153 UCHAR objt); 154 155 VOID 156 NTAPI 157 GDIOBJ_vUnlockObject( 158 POBJ pobj); 159 160 VOID 161 NTAPI 162 GDIOBJ_vSetObjectOwner( 163 POBJ pobj, 164 ULONG ulOwner); 165 166 BOOL 167 NTAPI 168 GDIOBJ_bLockMultipleObjects( 169 ULONG ulCount, 170 HGDIOBJ* ahObj, 171 PGDIOBJ* apObj, 172 UCHAR objt); 173 174 HGDIOBJ 175 NTAPI 176 GDIOBJ_hInsertObject( 177 POBJ pobj, 178 ULONG ulOwner); 179 180 VOID 181 NTAPI 182 GDIOBJ_vFreeObject( 183 POBJ pobj); 184 185 VOID 186 NTAPI 187 GDIOBJ_vSetObjectAttr( 188 POBJ pobj, 189 PVOID pvObjAttr); 190 191 PVOID 192 NTAPI 193 GDIOBJ_pvGetObjectAttr( 194 POBJ pobj); 195 196 BOOL NTAPI GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj); 197 POBJ NTAPI GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize); 198 PGDIOBJ NTAPI GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ObjectType); 199 PVOID NTAPI GDI_MapHandleTable(PEPROCESS Process); 200