1 #ifndef _WIN32K_OBJECT_H
2 #define _WIN32K_OBJECT_H
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 */
11 #define USER_HEADER_TO_BODY(ObjectHeader) \
12 ((PVOID)(((PUSER_OBJECT_HEADER)ObjectHeader) + 1))
14 #define USER_BODY_TO_HEADER(ObjectBody) \
15 ((PUSER_OBJECT_HEADER)(((PUSER_OBJECT_HEADER)ObjectBody) - 1))
19 typedef struct _USER_HANDLE_ENTRY
21 void *ptr
; /* pointer to object */
25 PTHREADINFO pti
; // pointer to Win32ThreadInfo
26 PPROCESSINFO ppi
; // pointer to W32ProcessInfo
28 unsigned short type
; /* object type (0 if free) */
29 unsigned short generation
; /* generation counter */
30 } USER_HANDLE_ENTRY
, * PUSER_HANDLE_ENTRY
;
34 typedef struct _USER_HANDLE_TABLE
36 PUSER_HANDLE_ENTRY handles
;
37 PUSER_HANDLE_ENTRY freelist
;
39 int allocated_handles
;
40 } USER_HANDLE_TABLE
, * PUSER_HANDLE_TABLE
;
44 typedef enum _USER_OBJECT_TYPE
61 typedef struct _USER_OBJECT_HEADER
63 * Header for user object
66 // USER_OBJECT_TYPE Type;
71 } USER_OBJECT_HEADER
, *PUSER_OBJECT_HEADER
;
74 typedef struct _USER_REFERENCE_ENTRY
76 SINGLE_LIST_ENTRY Entry
;
78 } USER_REFERENCE_ENTRY
, *PUSER_REFERENCE_ENTRY
;
84 #define USER_ASSERT(exp,file,line) \
85 if (!(exp)) {RtlAssert(#exp,(PVOID)file,line,"");}
88 UserAssertLastRef(PVOID obj
, const char *file
, int line
)
90 PTHREADINFO W32Thread
;
91 PSINGLE_LIST_ENTRY ReferenceEntry
;
92 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
94 USER_ASSERT(obj
!= NULL
, file
, line
);
95 W32Thread
= PsGetCurrentThreadWin32Thread();
96 USER_ASSERT(W32Thread
!= NULL
, file
, line
);
97 ReferenceEntry
= W32Thread
->ReferencesList
.Next
;
98 USER_ASSERT(ReferenceEntry
!= NULL
, file
, line
);
99 UserReferenceEntry
= CONTAINING_RECORD(ReferenceEntry
, USER_REFERENCE_ENTRY
, Entry
);
100 USER_ASSERT(UserReferenceEntry
!= NULL
, file
, line
);
101 USER_ASSERT(obj
== UserReferenceEntry
->obj
, file
, line
);
103 #define ASSERT_LAST_REF(_obj_) UserAssertLastRef(_obj,__FILE__,__LINE__)
107 extern PUSER_HANDLE_TABLE gHandleTable
;
108 VOID FASTCALL
UserReferenceObject(PVOID obj
);
109 PVOID FASTCALL
UserReferenceObjectByHandle(HANDLE handle
, USER_OBJECT_TYPE type
);
110 BOOL FASTCALL
UserDereferenceObject(PVOID obj
);
111 PVOID FASTCALL
UserCreateObject(PUSER_HANDLE_TABLE ht
, HANDLE
* h
,USER_OBJECT_TYPE type
, ULONG size
);
112 BOOL FASTCALL
UserDeleteObject(HANDLE h
, USER_OBJECT_TYPE type
);
113 PVOID
UserGetObject(PUSER_HANDLE_TABLE ht
, HANDLE handle
, USER_OBJECT_TYPE type
);
114 HANDLE
UserAllocHandle(PUSER_HANDLE_TABLE ht
, PVOID object
, USER_OBJECT_TYPE type
);
115 BOOL
UserFreeHandle(PUSER_HANDLE_TABLE ht
, HANDLE handle
);
116 PVOID
UserGetNextHandle(PUSER_HANDLE_TABLE ht
, HANDLE
* handle
, USER_OBJECT_TYPE type
);
117 PUSER_HANDLE_ENTRY
handle_to_entry(PUSER_HANDLE_TABLE ht
, HANDLE handle
);
118 BOOL FASTCALL
UserCreateHandleTable(VOID
);
119 VOID
UserInitHandleTable(PUSER_HANDLE_TABLE ht
, PVOID mem
, ULONG bytes
);
123 UserRefObjectCo(PVOID obj
, PUSER_REFERENCE_ENTRY UserReferenceEntry
)
125 PTHREADINFO W32Thread
;
127 W32Thread
= PsGetCurrentThreadWin32Thread();
128 ASSERT(W32Thread
!= NULL
);
129 ASSERT(UserReferenceEntry
!= NULL
);
130 UserReferenceEntry
->obj
= obj
;
131 UserReferenceObject(obj
);
132 PushEntryList(&W32Thread
->ReferencesList
, &UserReferenceEntry
->Entry
);
136 UserDerefObjectCo(PVOID obj
)
138 PTHREADINFO W32Thread
;
139 PSINGLE_LIST_ENTRY ReferenceEntry
;
140 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
143 W32Thread
= PsGetCurrentThreadWin32Thread();
144 ASSERT(W32Thread
!= NULL
);
145 ReferenceEntry
= PopEntryList(&W32Thread
->ReferencesList
);
146 ASSERT(ReferenceEntry
!= NULL
);
147 UserReferenceEntry
= CONTAINING_RECORD(ReferenceEntry
, USER_REFERENCE_ENTRY
, Entry
);
148 ASSERT(UserReferenceEntry
!= NULL
);
150 ASSERT(obj
== UserReferenceEntry
->obj
);
151 UserDereferenceObject(obj
);
154 HANDLE FASTCALL
UserObjectToHandle(PVOID obj
);
156 VOID FASTCALL
CreateStockObjects (VOID
);
157 VOID FASTCALL
CreateSysColorObjects (VOID
);
159 PPOINT FASTCALL
GDI_Bezier (const POINT
*Points
, INT count
, PINT nPtsOut
);
161 #endif /* _WIN32K_OBJECT_H */