3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Handle table
6 * FILE: lib/ntdll/rtl/handle.c
7 * PROGRAMER: Eric Kohl <ekohl@rz-online.de>
10 /* INCLUDES ******************************************************************/
12 #include <ddk/ntddk.h>
13 #include <internal/handle.h>
14 #include <internal/pool.h>
17 #include <internal/debug.h>
20 #define TAG_HDTB TAG('H', 'D', 'T', 'B')
24 RtlpIsValidHandle(PRTL_HANDLE_TABLE HandleTable, PRTL_HANDLE Handle);
26 RtlpIsValidIndexHandle(PRTL_HANDLE_TABLE HandleTable, PRTL_HANDLE *Handle, ULONG Index);
29 /* FUNCTIONS *****************************************************************/
32 RtlpInitializeHandleTable(ULONG TableSize,
33 PRTL_HANDLE_TABLE HandleTable)
35 /* initialize handle table */
38 sizeof(RTL_HANDLE_TABLE));
39 HandleTable->TableSize = TableSize;
44 RtlpDestroyHandleTable(PRTL_HANDLE_TABLE HandleTable)
46 ExFreePool((PVOID)HandleTable->Handles);
51 RtlpAllocateHandle(PRTL_HANDLE_TABLE HandleTable,
55 RTL_HANDLE **pp_new,**pph,*ph;
63 pp_new = &HandleTable->FirstFree;
65 if (HandleTable->FirstFree == NULL)
67 /* no free handle available */
68 if (HandleTable->LastUsed == NULL)
70 /* allocate handle array */
71 ArraySize = sizeof(RTL_HANDLE) * HandleTable->TableSize;
72 ArrayPointer = ExAllocatePoolWithTag(NonPagedPool,
75 if (ArrayPointer == NULL)
78 /* update handle array pointers */
79 HandleTable->Handles = (PRTL_HANDLE)ArrayPointer;
80 HandleTable->Limit = (PRTL_HANDLE)(ArrayPointer + ArraySize);
81 HandleTable->LastUsed = (PRTL_HANDLE)ArrayPointer;
84 /* build free list in handle array */
85 ph = HandleTable->LastUsed;
87 while (ph < HandleTable->Limit)
91 ph = (PRTL_HANDLE)((ULONG)ph + sizeof(RTL_HANDLE));
96 /* remove handle from free list */
98 *pp_new = retval->Next;
100 retval->Object = Object;
102 *Index = ((ULONG)retval - (ULONG)HandleTable->Handles) / sizeof(RTL_HANDLE);
109 RtlpFreeHandle(PRTL_HANDLE_TABLE HandleTable,
114 /* check if handle is valid */
115 if (! RtlpIsValidIndexHandle(HandleTable,
121 memset(Handle, 0, sizeof(RTL_HANDLE));
123 /* add handle to free list */
124 Handle->Next = HandleTable->FirstFree;
125 HandleTable->FirstFree = Handle;
132 RtlpIsValidHandle(PRTL_HANDLE_TABLE HandleTable,
135 if ((HandleTable != NULL)
137 && (Handle >= HandleTable->Handles)
138 && (Handle < HandleTable->Limit))
145 RtlpIsValidIndexHandle(PRTL_HANDLE_TABLE HandleTable,
149 PRTL_HANDLE InternalHandle;
151 DPRINT("RtlpIsValidIndexHandle(HandleTable %p Handle %p Index %x)\n", HandleTable, Handle, Index);
153 if (HandleTable == NULL)
156 DPRINT("Handles %p\n", HandleTable->Handles);
158 InternalHandle = (PRTL_HANDLE)((ULONG)HandleTable->Handles + sizeof(RTL_HANDLE) * Index);
159 if (RtlpIsValidHandle(HandleTable, InternalHandle) == FALSE)
162 DPRINT("InternalHandle %p\n", InternalHandle);
165 *Handle = InternalHandle;
171 RtlpMapHandleToPointer(PRTL_HANDLE_TABLE HandleTable,
176 if (!RtlpIsValidIndexHandle(HandleTable,
183 return Handle->Object;