006e9ed5a00638ad32087fa5382851b66992474d
[reactos.git] / reactos / subsys / win32k / ntuser / userobj.c
1 /* $Id: userobj.c,v 1.1 2001/07/06 00:05:05 rex Exp $
2 *
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)
8 *
9 */
10
11 #undef WIN32_LEAN_AND_MEAN
12 #include <windows.h>
13 #define NDEBUG
14 #include <debug.h>
15 #include <ddk/ntddk.h>
16 #include <win32k/userobj.h>
17
18 static LIST_ENTRY UserObjectList;
19
20 PUSER_OBJECT USEROBJ_AllocObject (WORD size, WORD magic)
21 {
22 PUSER_OBJECT_HEADER newObject;
23
24 newObject = ExAllocatePoolWithTag(PagedPool,
25 size + sizeof (USER_OBJECT_HEADER),
26 USER_OBJECT_TAG);
27 if (newObject == 0)
28 {
29 return 0;
30 }
31 RtlZeroMemory(newObject, size + sizeof (USER_OBJECT_HEADER));
32
33 newObject->magic = magic;
34 ExInitializeFastMutex (&newObject->mutex);
35 InsertTailList (&UserObjectList, &newObject->listEntry);
36
37 return UserObjectHeaderToBody (newObject);
38 }
39
40 BOOL USEROBJ_FreeObject (PUSER_OBJECT object, WORD magic)
41 {
42 PUSER_OBJECT_HEADER objectHeader;
43
44 if (object == NULL)
45 {
46 return FALSE;
47 }
48 objectHeader = UserObjectBodyToHeader (object);
49 if (objectHeader->magic != magic)
50 {
51 return FALSE;
52 }
53 RemoveEntryList (&objectHeader->listEntry);
54 ExFreePool (objectHeader);
55
56 return TRUE;
57 }
58
59 HUSEROBJ USEROBJ_PtrToHandle (PUSER_OBJECT object, WORD magic)
60 {
61 PUSER_OBJECT_HEADER objectHeader;
62
63 if (object == 0)
64 {
65 return 0;
66 }
67 objectHeader = UserObjectBodyToHeader (object);
68 if (objectHeader->magic != magic)
69 {
70 return 0;
71 }
72
73 return UserObjectHeaderToHandle(objectHeader);
74 }
75
76 PUSER_OBJECT USEROBJ_HandleToPtr (HUSEROBJ handle, WORD magic)
77 {
78 PUSER_OBJECT_HEADER objectHeader;
79
80 if (handle == 0)
81 {
82 return 0;
83 }
84 objectHeader = UserObjectHandleToHeader (handle);
85 if ((objectHeader->magic != magic) &&
86 (magic != UO_MAGIC_DONTCARE))
87 {
88 return 0;
89 }
90
91 return UserObjectHeaderToBody (objectHeader);
92 }
93
94 BOOL USEROBJ_LockObject (HUSEROBJ objectHandle)
95 {
96 PUSER_OBJECT_HEADER objectHeader;
97
98 if (objectHandle == 0)
99 {
100 return FALSE;
101 }
102 objectHeader = UserObjectHandleToHeader (objectHandle);
103
104 ExAcquireFastMutexUnsafe (&objectHeader->mutex);
105
106 return TRUE;
107 }
108
109 BOOL USEROBJ_UnlockObject (HUSEROBJ objectHandle)
110 {
111 PUSER_OBJECT_HEADER objectHeader;
112
113 if (objectHandle == 0)
114 {
115 return FALSE;
116 }
117 objectHeader = UserObjectHandleToHeader (objectHandle);
118
119 ExReleaseFastMutexUnsafe (&objectHeader->mutex);
120
121 return TRUE;
122 }
123
124
125