3 typedef struct _USER_REFERENCE_ENTRY
5 SINGLE_LIST_ENTRY Entry
;
7 } USER_REFERENCE_ENTRY
, *PUSER_REFERENCE_ENTRY
;
9 #define USER_ASSERT(exp,file,line) \
10 if (!(exp)) {RtlAssert(#exp,(PVOID)file,line,"");}
13 UserAssertLastRef(PVOID obj
, const char *file
, int line
)
15 PTHREADINFO W32Thread
;
16 PSINGLE_LIST_ENTRY ReferenceEntry
;
17 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
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
);
28 #define ASSERT_LAST_REF(_obj_) UserAssertLastRef(_obj,__FILE__,__LINE__)
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
);
46 UserRefObjectCo(PVOID obj
, PUSER_REFERENCE_ENTRY UserReferenceEntry
)
48 PTHREADINFO W32Thread
;
50 W32Thread
= PsGetCurrentThreadWin32Thread();
51 ASSERT(W32Thread
!= NULL
);
52 ASSERT(UserReferenceEntry
!= NULL
);
53 UserReferenceEntry
->obj
= obj
;
54 UserReferenceObject(obj
);
55 PushEntryList(&W32Thread
->ReferencesList
, &UserReferenceEntry
->Entry
);
59 UserDerefObjectCo(PVOID obj
)
61 PTHREADINFO W32Thread
;
62 PSINGLE_LIST_ENTRY ReferenceEntry
;
63 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
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
);
73 ASSERT(obj
== UserReferenceEntry
->obj
);
74 UserDereferenceObject(obj
);