Revert r20367 and r20368 since they crash the GUI in second boot by hitting a assert...
[reactos.git] / reactos / subsys / win32k / include / object.h
1 #ifndef _WIN32K_OBJECT_H
2 #define _WIN32K_OBJECT_H
3
4 #include <win32k/gdiobj.h>
5 #include <win32k/bitmaps.h>
6 #include <win32k/pen.h>
7
8 #define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */
9 #define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */
10
11
12 #define USER_HEADER_TO_BODY(ObjectHeader) \
13 ((PVOID)(((PUSER_OBJECT_HEADER)ObjectHeader) + 1))
14
15 #define USER_BODY_TO_HEADER(ObjectBody) \
16 ((PUSER_OBJECT_HEADER)(((PUSER_OBJECT_HEADER)ObjectBody) - 1))
17
18
19
20 typedef struct _USER_HANDLE_ENTRY
21 {
22 void *ptr; /* pointer to object */
23 unsigned short type; /* object type (0 if free) */
24 unsigned short generation; /* generation counter */
25 } USER_HANDLE_ENTRY, * PUSER_HANDLE_ENTRY;
26
27
28
29 typedef struct _USER_HANDLE_TABLE
30 {
31 PUSER_HANDLE_ENTRY handles;
32 PUSER_HANDLE_ENTRY freelist;
33 int nb_handles;
34 int allocated_handles;
35 } USER_HANDLE_TABLE, * PUSER_HANDLE_TABLE;
36
37
38
39 typedef enum _USER_OBJECT_TYPE
40 {
41 otFree = 0,
42 otWindow,
43 otMenu,
44 otAccel,
45 otCursorIcon,
46 otHook,
47 otMonitor,
48 otClass //fixme: remove
49
50 } USER_OBJECT_TYPE;
51
52
53 typedef struct _USER_OBJECT_HEADER
54 /*
55 * Header for user object
56 */
57 {
58 // USER_OBJECT_TYPE Type;
59 LONG RefCount;
60 BOOL destroyed;
61 HANDLE hSelf;
62 // CSHORT Size;
63 } USER_OBJECT_HEADER, *PUSER_OBJECT_HEADER;
64
65
66 typedef struct _USER_REFERENCE_ENTRY
67 {
68 SINGLE_LIST_ENTRY Entry;
69 PVOID obj;
70 } USER_REFERENCE_ENTRY, *PUSER_REFERENCE_ENTRY;
71
72
73
74 #include <malloc.h>
75
76 #define ASSERT_LAST_REF(_obj_) \
77 { \
78 PW32THREAD t; \
79 PSINGLE_LIST_ENTRY e; \
80 PUSER_REFERENCE_ENTRY ref; \
81 \
82 ASSERT(_obj_); \
83 t = PsGetWin32Thread(); \
84 ASSERT(t); \
85 e = t->ReferencesList.Next; \
86 ASSERT(e); \
87 ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
88 ASSERT(ref); \
89 \
90 ASSERT(_obj_ == ref->obj); \
91 \
92 }
93 #define UserRefObjectCo(_obj_, _ref_) \
94 { \
95 PW32THREAD t; \
96 \
97 ASSERT(_obj_); \
98 t = PsGetWin32Thread(); \
99 ASSERT(t); \
100 ASSERT(_ref_); \
101 (_ref_)->obj = _obj_; \
102 ObmReferenceObject(_obj_); \
103 \
104 PushEntryList(&t->ReferencesList, &(_ref_)->Entry); \
105 \
106 }
107
108
109 #define UserDerefObjectCo(_obj_) \
110 { \
111 PW32THREAD t; \
112 PSINGLE_LIST_ENTRY e; \
113 PUSER_REFERENCE_ENTRY ref; \
114 \
115 ASSERT(_obj_); \
116 t = PsGetWin32Thread(); \
117 ASSERT(t); \
118 e = PopEntryList(&t->ReferencesList); \
119 ASSERT(e); \
120 ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
121 ASSERT(ref); \
122 \
123 ASSERT(_obj_ == ref->obj); \
124 ObmDereferenceObject(_obj_); \
125 \
126 }
127
128 VOID INTERNAL_CALL InitGdiObjectHandleTable (VOID);
129
130 VOID FASTCALL CreateStockObjects (VOID);
131 VOID FASTCALL CreateSysColorObjects (VOID);
132
133 PPOINT FASTCALL GDI_Bezier (const POINT *Points, INT count, PINT nPtsOut);
134
135 #endif /* _WIN32K_OBJECT_H */
136
137 /* EOF */