[WIN32K]
[reactos.git] / reactos / win32ss / user / ntuser / object.h
1 #pragma once
2
3 typedef struct _USER_REFERENCE_ENTRY
4 {
5 SINGLE_LIST_ENTRY Entry;
6 PVOID obj;
7 } USER_REFERENCE_ENTRY, *PUSER_REFERENCE_ENTRY;
8
9 #define USER_ASSERT(exp,file,line) \
10 if (!(exp)) {RtlAssert(#exp,(PVOID)file,line,"");}
11
12 static __inline VOID
13 UserAssertLastRef(PVOID obj, const char *file, int line)
14 {
15 PTHREADINFO W32Thread;
16 PSINGLE_LIST_ENTRY ReferenceEntry;
17 PUSER_REFERENCE_ENTRY UserReferenceEntry;
18
19 USER_ASSERT(obj != NULL, file, line);
20 W32Thread = PsGetCurrentThreadWin32Thread();
21 USER_ASSERT(W32Thread != NULL, file, line);
22 ReferenceEntry = W32Thread->ReferencesList.Next;
23 USER_ASSERT(ReferenceEntry != NULL, file, line);
24 UserReferenceEntry = CONTAINING_RECORD(ReferenceEntry, USER_REFERENCE_ENTRY, Entry);
25 USER_ASSERT(UserReferenceEntry != NULL, file, line);
26 USER_ASSERT(obj == UserReferenceEntry->obj, file, line);
27 }
28 #define ASSERT_LAST_REF(_obj_) UserAssertLastRef(_obj,__FILE__,__LINE__)
29
30 #undef USER_ASSERT
31
32 extern PUSER_HANDLE_TABLE gHandleTable;
33 VOID FASTCALL UserReferenceObject(PVOID obj);
34 PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, HANDLE_TYPE type);
35 BOOL FASTCALL UserDereferenceObject(PVOID obj);
36 PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, struct _DESKTOP* pDesktop, PTHREADINFO pti, HANDLE* h,HANDLE_TYPE type , ULONG size);
37 BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type );
38 PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type );
39 PVOID UserGetObjectNoErr(PUSER_HANDLE_TABLE, HANDLE, HANDLE_TYPE);
40 BOOL FASTCALL UserCreateHandleTable(VOID);
41 BOOL FASTCALL UserObjectInDestroy(HANDLE);
42 void DbgUserDumpHandleTable();
43 VOID FASTCALL UserSetObjectOwner(PVOID obj, HANDLE_TYPE type, PVOID owner);
44
45 static __inline VOID
46 UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
47 {
48 PTHREADINFO W32Thread;
49
50 W32Thread = PsGetCurrentThreadWin32Thread();
51 ASSERT(W32Thread != NULL);
52 ASSERT(UserReferenceEntry != NULL);
53 UserReferenceEntry->obj = obj;
54 UserReferenceObject(obj);
55 PushEntryList(&W32Thread->ReferencesList, &UserReferenceEntry->Entry);
56 }
57
58 static __inline VOID
59 UserDerefObjectCo(PVOID obj)
60 {
61 PTHREADINFO W32Thread;
62 PSINGLE_LIST_ENTRY ReferenceEntry;
63 PUSER_REFERENCE_ENTRY UserReferenceEntry;
64
65 ASSERT(obj != NULL);
66 W32Thread = PsGetCurrentThreadWin32Thread();
67 ASSERT(W32Thread != NULL);
68 ReferenceEntry = PopEntryList(&W32Thread->ReferencesList);
69 ASSERT(ReferenceEntry != NULL);
70 UserReferenceEntry = CONTAINING_RECORD(ReferenceEntry, USER_REFERENCE_ENTRY, Entry);
71 ASSERT(UserReferenceEntry != NULL);
72
73 ASSERT(obj == UserReferenceEntry->obj);
74 UserDereferenceObject(obj);
75 }
76
77 /* EOF */