- Added support for NTLDR style freeloader GUI. To enable, edit freeldr.ini and add:
[reactos.git] / reactos / include / win32k / gdiobj.h
1 /*
2 * GDI object common header definition
3 *
4 */
5
6 #ifndef __WIN32K_GDIOBJ_H
7 #define __WIN32K_GDIOBJ_H
8
9 /* base address where the handle table is mapped to */
10 #define GDI_HANDLE_TABLE_BASE_ADDRESS (0x400000)
11
12 /* gdi handle table can hold 0x4000 handles */
13 #define GDI_HANDLE_COUNT 0x4000
14
15 #define GDI_GLOBAL_PROCESS (0x0)
16
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
21
22 #define GDI_HANDLE_REUSECNT_SHIFT 24
23
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))
30
31
32 /*! \defgroup GDI object types
33 *
34 * GDI object types
35 *
36 */
37 /*@{*/
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
57 /*@}*/
58
59 typedef PVOID PGDIOBJ;
60
61 #ifndef NTOS_MODE_USER
62 typedef BOOL (INTERNAL_CALL *GDICLEANUPPROC)(PVOID ObjectBody);
63 #endif
64
65 /*!
66 * GDI object header. This is a part of any GDI object
67 */
68 typedef struct _GDIOBJHDR
69 {
70 #ifdef NTOS_MODE_USER
71 PVOID LockingThread;
72 #else
73 PETHREAD LockingThread; /* only assigned if a thread is holding the lock! */
74 #endif
75 ULONG Locks;
76 #ifdef GDI_DEBUG
77 const char* createdfile;
78 int createdline;
79 const char* lockfile;
80 int lockline;
81 #endif
82 } GDIOBJHDR, *PGDIOBJHDR;
83
84 #ifndef NTOS_MODE_USER
85
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);
91
92 #define GDIOBJ_GetObjectType(Handle) \
93 GDI_HANDLE_GET_TYPE(Handle)
94
95 #ifdef GDI_DEBUG
96
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)
102
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);
107
108 #else /* !GDI_DEBUG */
109
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);
114
115 #endif /* GDI_DEBUG */
116
117 PVOID INTERNAL_CALL GDI_MapHandleTable(PEPROCESS Process);
118
119 #endif
120
121 #define GDIOBJFLAG_DEFAULT (0x0)
122 #define GDIOBJFLAG_IGNOREPID (0x1)
123 #define GDIOBJFLAG_IGNORELOCK (0x2)
124
125 #endif