2 * GDI object common header definition
6 #ifndef __WIN32K_GDIOBJ_H
7 #define __WIN32K_GDIOBJ_H
9 /* base address where the handle table is mapped to */
10 #define GDI_HANDLE_TABLE_BASE_ADDRESS (0x400000)
12 /* gdi handle table can hold 0x4000 handles */
13 #define GDI_HANDLE_COUNT 0x4000
15 #define GDI_GLOBAL_PROCESS (0x0)
17 #define GDI_HANDLE_INDEX_MASK (GDI_HANDLE_COUNT - 1)
18 #define GDI_HANDLE_TYPE_MASK 0x007f0000
19 #define GDI_HANDLE_STOCK_MASK 0x00800000
20 #define GDI_HANDLE_REUSE_MASK 0xff000000
22 #define GDI_HANDLE_REUSECNT_SHIFT 24
24 #define GDI_HANDLE_CREATE(i, t) ((HANDLE)(((i) & GDI_HANDLE_INDEX_MASK) | ((t) & GDI_HANDLE_TYPE_MASK)))
25 #define GDI_HANDLE_GET_INDEX(h) (((ULONG_PTR)(h)) & GDI_HANDLE_INDEX_MASK)
26 #define GDI_HANDLE_GET_TYPE(h) (((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK)
27 #define GDI_HANDLE_IS_TYPE(h, t) ((t) == (((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK))
28 #define GDI_HANDLE_IS_STOCKOBJ(h) (0 != (((ULONG_PTR)(h)) & GDI_HANDLE_STOCK_MASK))
29 #define GDI_HANDLE_SET_STOCKOBJ(h) ((h) = (HANDLE)(((ULONG_PTR)(h)) | GDI_HANDLE_STOCK_MASK))
32 /*! \defgroup GDI object types
38 #define GDI_OBJECT_TYPE_DC 0x00010000
39 #define GDI_OBJECT_TYPE_REGION 0x00040000
40 #define GDI_OBJECT_TYPE_BITMAP 0x00050000
41 #define GDI_OBJECT_TYPE_PALETTE 0x00080000
42 #define GDI_OBJECT_TYPE_FONT 0x000a0000
43 #define GDI_OBJECT_TYPE_BRUSH 0x00100000
44 #define GDI_OBJECT_TYPE_EMF 0x00210000
45 #define GDI_OBJECT_TYPE_PEN 0x00300000
46 #define GDI_OBJECT_TYPE_EXTPEN 0x00500000
47 /* Following object types made up for ROS */
48 #define GDI_OBJECT_TYPE_METADC 0x00710000
49 #define GDI_OBJECT_TYPE_METAFILE 0x00720000
50 #define GDI_OBJECT_TYPE_ENHMETAFILE 0x00730000
51 #define GDI_OBJECT_TYPE_ENHMETADC 0x00740000
52 #define GDI_OBJECT_TYPE_MEMDC 0x00750000
53 #define GDI_OBJECT_TYPE_DCE 0x00770000
54 #define GDI_OBJECT_TYPE_DONTCARE 0x007f0000
55 /** Not really an object type. Forces GDI_FreeObj to be silent. */
56 #define GDI_OBJECT_TYPE_SILENT 0x80000000
59 typedef PVOID PGDIOBJ
;
61 #ifndef NTOS_MODE_USER
62 typedef BOOL (INTERNAL_CALL
*GDICLEANUPPROC
)(PVOID ObjectBody
);
66 * GDI object header. This is a part of any GDI object
68 typedef struct _GDIOBJHDR
73 PETHREAD LockingThread
; /* only assigned if a thread is holding the lock! */
77 const char* createdfile
;
82 } GDIOBJHDR
, *PGDIOBJHDR
;
84 #ifndef NTOS_MODE_USER
86 BOOL INTERNAL_CALL
GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle
);
87 void INTERNAL_CALL
GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle
, PEPROCESS Owner
);
88 void INTERNAL_CALL
GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom
, HGDIOBJ CopyTo
);
89 BOOL INTERNAL_CALL
GDIOBJ_ConvertToStockObj(HGDIOBJ
*hObj
);
90 VOID INTERNAL_CALL
GDIOBJ_UnlockObjByPtr(PGDIOBJ Object
);
92 #define GDIOBJ_GetObjectType(Handle) \
93 GDI_HANDLE_GET_TYPE(Handle)
97 /* a couple macros for debugging GDIOBJ locking */
98 #define GDIOBJ_AllocObj(ty) GDIOBJ_AllocObjDbg(__FILE__,__LINE__,ty)
99 #define GDIOBJ_FreeObj(obj,ty) GDIOBJ_FreeObjDbg(__FILE__,__LINE__,obj,ty)
100 #define GDIOBJ_LockObj(obj,ty) GDIOBJ_LockObjDbg(__FILE__,__LINE__,obj,ty)
101 #define GDIOBJ_ShareLockObj(obj,ty) GDIOBJ_ShareLockObjDbg(__FILE__,__LINE__,obj,ty)
103 HGDIOBJ INTERNAL_CALL
GDIOBJ_AllocObjDbg(const char* file
, int line
, ULONG ObjectType
);
104 BOOL INTERNAL_CALL
GDIOBJ_FreeObjDbg (const char* file
, int line
, HGDIOBJ hObj
, DWORD ObjectType
);
105 PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObjDbg (const char* file
, int line
, HGDIOBJ hObj
, DWORD ObjectType
);
106 PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObjDbg (const char* file
, int line
, HGDIOBJ hObj
, DWORD ObjectType
);
108 #else /* !GDI_DEBUG */
110 HGDIOBJ INTERNAL_CALL
GDIOBJ_AllocObj(ULONG ObjectType
);
111 BOOL INTERNAL_CALL
GDIOBJ_FreeObj (HGDIOBJ hObj
, DWORD ObjectType
);
112 PGDIOBJ INTERNAL_CALL
GDIOBJ_LockObj (HGDIOBJ hObj
, DWORD ObjectType
);
113 PGDIOBJ INTERNAL_CALL
GDIOBJ_ShareLockObj (HGDIOBJ hObj
, DWORD ObjectType
);
115 #endif /* GDI_DEBUG */
117 PVOID INTERNAL_CALL
GDI_MapHandleTable(PEPROCESS Process
);
121 #define GDIOBJFLAG_DEFAULT (0x0)
122 #define GDIOBJFLAG_IGNOREPID (0x1)
123 #define GDIOBJFLAG_IGNORELOCK (0x2)