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 <ntdll/rtl.h>
16 #include <ntdll/ntdll.h>
18 /* FUNCTIONS *****************************************************************/
21 RtlInitializeHandleTable(ULONG TableSize,
23 PRTL_HANDLE_TABLE HandleTable)
25 /* initialize handle table */
28 sizeof(RTL_HANDLE_TABLE));
29 HandleTable->TableSize = TableSize;
30 HandleTable->HandleSize = HandleSize;
38 RtlDestroyHandleTable(PRTL_HANDLE_TABLE HandleTable)
43 /* free handle array */
44 ArrayPointer = (PVOID)HandleTable->Handles;
45 ArraySize = (ULONG)HandleTable->Limit - (ULONG)HandleTable->Handles;
46 NtFreeVirtualMemory(NtCurrentProcess(),
57 RtlAllocateHandle(PRTL_HANDLE_TABLE HandleTable,
60 RTL_HANDLE **pp_new,**pph,*ph;
66 pp_new = &HandleTable->FirstFree;
68 if (HandleTable->FirstFree == NULL)
70 /* no free handle available */
71 if (HandleTable->LastUsed == NULL)
73 /* allocate handle array */
74 ArraySize = HandleTable->HandleSize * HandleTable->TableSize;
76 Status = NtAllocateVirtualMemory(NtCurrentProcess(),
77 (PVOID*)&ArrayPointer,
80 MEM_RESERVE | MEM_COMMIT,
82 if (!NT_SUCCESS(Status))
85 /* update handle array pointers */
86 HandleTable->Handles = (PRTL_HANDLE)ArrayPointer;
87 HandleTable->Limit = (PRTL_HANDLE)(ArrayPointer + ArraySize);
88 HandleTable->LastUsed = (PRTL_HANDLE)ArrayPointer;
91 /* build free list in handle array */
92 ph = HandleTable->LastUsed;
94 while (ph < HandleTable->Limit)
98 ph = (PRTL_HANDLE)((ULONG)ph + HandleTable->HandleSize);
103 /* remove handle from free list */
105 *pp_new = retval->Next;
109 *Index = ((ULONG)retval - (ULONG)HandleTable->Handles) / HandleTable->HandleSize;
119 RtlFreeHandle(PRTL_HANDLE_TABLE HandleTable,
122 /* check if handle is valid */
123 if (RtlIsValidHandle(HandleTable, Handle))
127 memset(Handle, 0, HandleTable->HandleSize);
129 /* add handle to free list */
130 Handle->Next = HandleTable->FirstFree;
131 HandleTable->FirstFree = Handle;
141 RtlIsValidHandle(PRTL_HANDLE_TABLE HandleTable,
144 if ((HandleTable != NULL)
146 && (Handle >= HandleTable->Handles)
147 && (Handle < HandleTable->Limit))
157 RtlIsValidIndexHandle(PRTL_HANDLE_TABLE HandleTable,
161 PRTL_HANDLE InternalHandle;
163 DPRINT("RtlIsValidIndexHandle(HandleTable %p Handle %p Index %x)\n", HandleTable, Handle, Index);
165 if (HandleTable == NULL)
168 DPRINT("Handles %p HandleSize %x\n",
169 HandleTable->Handles, HandleTable->HandleSize);
171 InternalHandle = (PRTL_HANDLE)((ULONG)HandleTable->Handles + (HandleTable->HandleSize * Index));
172 if (RtlIsValidHandle(HandleTable, InternalHandle) == FALSE)
175 DPRINT("InternalHandle %p\n", InternalHandle);
178 *Handle = InternalHandle;