[USER32]
[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 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 VOID FASTCALL UserSetObjectOwner(PVOID obj, HANDLE_TYPE type, PVOID owner);
21 HANDLE FASTCALL ValidateHandleNoErr(HANDLE handle, HANDLE_TYPE type);
22 PVOID FASTCALL ValidateHandle(HANDLE handle, HANDLE_TYPE type);
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 UNREFERENCED_LOCAL_VARIABLE(UserReferenceEntry);
44
45 ASSERT(obj != NULL);
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);
52
53 ASSERT(obj == UserReferenceEntry->obj);
54 UserDereferenceObject(obj);
55 }
56
57 /* EOF */