2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * PURPOSE: USER Object manager interface definition
24 * FILE: subsys/win32k/ntuser/userobj.c
25 * PROGRAMER: Rex Jolliff (rex@lvcablemodem.com)
29 #undef WIN32_LEAN_AND_MEAN
33 #include <ddk/ntddk.h>
34 #include <win32k/userobj.h>
36 static LIST_ENTRY UserObjectList;
38 PUSER_OBJECT FASTCALL USEROBJ_AllocObject (WORD size, WORD magic)
40 PUSER_OBJECT_HEADER newObject;
42 newObject = ExAllocatePoolWithTag(PagedPool,
43 size + sizeof (USER_OBJECT_HEADER),
49 RtlZeroMemory(newObject, size + sizeof (USER_OBJECT_HEADER));
51 newObject->magic = magic;
52 ExInitializeFastMutex (&newObject->mutex);
53 InsertTailList (&UserObjectList, &newObject->listEntry);
55 return UserObjectHeaderToBody (newObject);
58 BOOL FASTCALL USEROBJ_FreeObject (PUSER_OBJECT object, WORD magic)
60 PUSER_OBJECT_HEADER objectHeader;
66 objectHeader = UserObjectBodyToHeader (object);
67 if (objectHeader->magic != magic)
71 RemoveEntryList (&objectHeader->listEntry);
72 ExFreePool (objectHeader);
77 HUSEROBJ FASTCALL USEROBJ_PtrToHandle (PUSER_OBJECT object, WORD magic)
79 PUSER_OBJECT_HEADER objectHeader;
85 objectHeader = UserObjectBodyToHeader (object);
86 if (objectHeader->magic != magic)
91 return UserObjectHeaderToHandle(objectHeader);
94 PUSER_OBJECT FASTCALL USEROBJ_HandleToPtr (HUSEROBJ handle, WORD magic)
96 PUSER_OBJECT_HEADER objectHeader;
102 objectHeader = UserObjectHandleToHeader (handle);
103 if ((objectHeader->magic != magic) &&
104 (magic != UO_MAGIC_DONTCARE))
109 return UserObjectHeaderToBody (objectHeader);
112 BOOL FASTCALL USEROBJ_LockObject (HUSEROBJ objectHandle)
114 PUSER_OBJECT_HEADER objectHeader;
116 if (objectHandle == 0)
120 objectHeader = UserObjectHandleToHeader (objectHandle);
122 ExAcquireFastMutexUnsafe (&objectHeader->mutex);
127 BOOL FASTCALL USEROBJ_UnlockObject (HUSEROBJ objectHandle)
129 PUSER_OBJECT_HEADER objectHeader;
131 if (objectHandle == 0)
135 objectHeader = UserObjectHandleToHeader (objectHandle);
137 ExReleaseFastMutexUnsafe (&objectHeader->mutex);