3 typedef struct _USER_REFERENCE_ENTRY
5 SINGLE_LIST_ENTRY Entry
;
7 } USER_REFERENCE_ENTRY
, *PUSER_REFERENCE_ENTRY
;
9 extern PUSER_HANDLE_TABLE gHandleTable
;
10 VOID FASTCALL
UserReferenceObject(PVOID obj
);
11 PVOID FASTCALL
UserReferenceObjectByHandle(HANDLE handle
, HANDLE_TYPE type
);
12 BOOL FASTCALL
UserDereferenceObject(PVOID obj
);
13 PVOID FASTCALL
UserCreateObject(PUSER_HANDLE_TABLE ht
, struct _DESKTOP
* pDesktop
, PTHREADINFO pti
, HANDLE
* h
,HANDLE_TYPE type
, ULONG size
);
14 BOOL FASTCALL
UserDeleteObject(HANDLE h
, HANDLE_TYPE type
);
15 PVOID
UserGetObject(PUSER_HANDLE_TABLE ht
, HANDLE handle
, HANDLE_TYPE type
);
16 PVOID
UserGetObjectNoErr(PUSER_HANDLE_TABLE
, HANDLE
, HANDLE_TYPE
);
17 BOOL FASTCALL
UserCreateHandleTable(VOID
);
18 BOOL FASTCALL
UserObjectInDestroy(HANDLE
);
19 void DbgUserDumpHandleTable();
20 PVOID FASTCALL
ValidateHandle(HANDLE handle
, HANDLE_TYPE type
);
21 BOOLEAN
UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table
, PVOID Owner
);
22 BOOL FASTCALL
UserMarkObjectDestroy(PVOID
);
25 UserRefObjectCo(PVOID obj
, PUSER_REFERENCE_ENTRY UserReferenceEntry
)
27 PTHREADINFO W32Thread
;
29 W32Thread
= PsGetCurrentThreadWin32Thread();
30 ASSERT(W32Thread
!= NULL
);
31 ASSERT(UserReferenceEntry
!= NULL
);
32 UserReferenceEntry
->obj
= obj
;
33 UserReferenceObject(obj
);
34 PushEntryList(&W32Thread
->ReferencesList
, &UserReferenceEntry
->Entry
);
38 UserDerefObjectCo(PVOID obj
)
40 PTHREADINFO W32Thread
;
41 PSINGLE_LIST_ENTRY ReferenceEntry
;
42 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
43 UNREFERENCED_LOCAL_VARIABLE(UserReferenceEntry
);
46 W32Thread
= PsGetCurrentThreadWin32Thread();
47 ASSERT(W32Thread
!= NULL
);
48 ReferenceEntry
= PopEntryList(&W32Thread
->ReferencesList
);
49 ASSERT(ReferenceEntry
!= NULL
);
50 UserReferenceEntry
= CONTAINING_RECORD(ReferenceEntry
, USER_REFERENCE_ENTRY
, Entry
);
51 ASSERT(UserReferenceEntry
!= NULL
);
53 ASSERT(obj
== UserReferenceEntry
->obj
);
54 UserDereferenceObject(obj
);
57 void FreeProcMarkObject(_In_ PVOID Object
);