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
);
24 UserRefObjectCo(PVOID obj
, PUSER_REFERENCE_ENTRY UserReferenceEntry
)
26 PTHREADINFO W32Thread
;
28 W32Thread
= PsGetCurrentThreadWin32Thread();
29 ASSERT(W32Thread
!= NULL
);
30 ASSERT(UserReferenceEntry
!= NULL
);
31 UserReferenceEntry
->obj
= obj
;
32 UserReferenceObject(obj
);
33 PushEntryList(&W32Thread
->ReferencesList
, &UserReferenceEntry
->Entry
);
37 UserDerefObjectCo(PVOID obj
)
39 PTHREADINFO W32Thread
;
40 PSINGLE_LIST_ENTRY ReferenceEntry
;
41 PUSER_REFERENCE_ENTRY UserReferenceEntry
;
42 UNREFERENCED_LOCAL_VARIABLE(UserReferenceEntry
);
45 W32Thread
= PsGetCurrentThreadWin32Thread();
46 ASSERT(W32Thread
!= NULL
);
47 ReferenceEntry
= PopEntryList(&W32Thread
->ReferencesList
);
48 ASSERT(ReferenceEntry
!= NULL
);
49 UserReferenceEntry
= CONTAINING_RECORD(ReferenceEntry
, USER_REFERENCE_ENTRY
, Entry
);
50 ASSERT(UserReferenceEntry
!= NULL
);
52 ASSERT(obj
== UserReferenceEntry
->obj
);
53 UserDereferenceObject(obj
);
56 void FreeProcMarkObject(_In_ PVOID Object
);