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 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); 23 24 static __inline VOID 25 UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry) 26 { 27 PTHREADINFO W32Thread; 28 29 W32Thread = PsGetCurrentThreadWin32Thread(); 30 ASSERT(W32Thread != NULL); 31 ASSERT(UserReferenceEntry != NULL); 32 UserReferenceEntry->obj = obj; 33 UserReferenceObject(obj); 34 PushEntryList(&W32Thread->ReferencesList, &UserReferenceEntry->Entry); 35 } 36 37 static __inline VOID 38 UserDerefObjectCo(PVOID obj) 39 { 40 PTHREADINFO W32Thread; 41 PSINGLE_LIST_ENTRY ReferenceEntry; 42 PUSER_REFERENCE_ENTRY UserReferenceEntry; 43 44 ASSERT(obj != NULL); 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); 51 52 ASSERT(obj == UserReferenceEntry->obj); 53 UserDereferenceObject(obj); 54 } 55 56 void FreeProcMarkObject(_In_ PVOID Object); 57 58 /* EOF */ 59