3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: USER Object manager interface definition
6 * FILE: subsys/win32k/ntuser/userobj.c
7 * PROGRAMER: Rex Jolliff (rex@lvcablemodem.com)
11 #undef WIN32_LEAN_AND_MEAN
15 #include <ddk/ntddk.h>
16 #include <win32k/userobj.h>
18 static LIST_ENTRY UserObjectList;
20 PUSER_OBJECT USEROBJ_AllocObject (WORD size, WORD magic)
22 PUSER_OBJECT_HEADER newObject;
24 newObject = ExAllocatePoolWithTag(PagedPool,
25 size + sizeof (USER_OBJECT_HEADER),
31 RtlZeroMemory(newObject, size + sizeof (USER_OBJECT_HEADER));
33 newObject->magic = magic;
34 ExInitializeFastMutex (&newObject->mutex);
35 InsertTailList (&UserObjectList, &newObject->listEntry);
37 return UserObjectHeaderToBody (newObject);
40 BOOL USEROBJ_FreeObject (PUSER_OBJECT object, WORD magic)
42 PUSER_OBJECT_HEADER objectHeader;
48 objectHeader = UserObjectBodyToHeader (object);
49 if (objectHeader->magic != magic)
53 RemoveEntryList (&objectHeader->listEntry);
54 ExFreePool (objectHeader);
59 HUSEROBJ USEROBJ_PtrToHandle (PUSER_OBJECT object, WORD magic)
61 PUSER_OBJECT_HEADER objectHeader;
67 objectHeader = UserObjectBodyToHeader (object);
68 if (objectHeader->magic != magic)
73 return UserObjectHeaderToHandle(objectHeader);
76 PUSER_OBJECT USEROBJ_HandleToPtr (HUSEROBJ handle, WORD magic)
78 PUSER_OBJECT_HEADER objectHeader;
84 objectHeader = UserObjectHandleToHeader (handle);
85 if ((objectHeader->magic != magic) &&
86 (magic != UO_MAGIC_DONTCARE))
91 return UserObjectHeaderToBody (objectHeader);
94 BOOL USEROBJ_LockObject (HUSEROBJ objectHandle)
96 PUSER_OBJECT_HEADER objectHeader;
98 if (objectHandle == 0)
102 objectHeader = UserObjectHandleToHeader (objectHandle);
104 ExAcquireFastMutexUnsafe (&objectHeader->mutex);
109 BOOL USEROBJ_UnlockObject (HUSEROBJ objectHandle)
111 PUSER_OBJECT_HEADER objectHeader;
113 if (objectHandle == 0)
117 objectHeader = UserObjectHandleToHeader (objectHandle);
119 ExReleaseFastMutexUnsafe (&objectHeader->mutex);