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;
35 RtlDestroyHandleTable(PRTL_HANDLE_TABLE HandleTable)
40 /* free handle array */
41 ArrayPointer = (PVOID)HandleTable->Handles;
42 ArraySize = (ULONG)HandleTable->Limit - (ULONG)HandleTable->Handles;
43 NtFreeVirtualMemory(NtCurrentProcess(),
51 RtlAllocateHandle(PRTL_HANDLE_TABLE HandleTable,
54 RTL_HANDLE **pp_new,**pph,*ph;
60 pp_new = &HandleTable->FirstFree;
62 if (HandleTable->FirstFree == NULL)
64 /* no free handle available */
65 if (HandleTable->LastUsed == NULL)
67 /* allocate handle array */
68 ArraySize = HandleTable->HandleSize * HandleTable->TableSize;
70 Status = NtAllocateVirtualMemory(NtCurrentProcess(),
71 (PVOID*)&ArrayPointer,
74 MEM_RESERVE | MEM_COMMIT,
76 if (!NT_SUCCESS(Status))
79 /* update handle array pointers */
80 HandleTable->Handles = (PRTL_HANDLE)ArrayPointer;
81 HandleTable->Limit = (PRTL_HANDLE)(ArrayPointer + ArraySize);
82 HandleTable->LastUsed = (PRTL_HANDLE)ArrayPointer;
85 /* build free list in handle array */
86 ph = HandleTable->LastUsed;
88 while (ph < HandleTable->Limit)
92 ph = (PRTL_HANDLE)((ULONG)ph + HandleTable->HandleSize);
97 /* remove handle from free list */
99 *pp_new = retval->Next;
103 *Index = ((ULONG)retval - (ULONG)HandleTable->Handles) / HandleTable->HandleSize;
110 RtlFreeHandle(PRTL_HANDLE_TABLE HandleTable,
113 /* check if handle is valid */
114 if (RtlIsValidHandle(HandleTable, Handle))
118 memset(Handle, 0, HandleTable->HandleSize);
120 /* add handle to free list */
121 Handle->Next = HandleTable->FirstFree;
122 HandleTable->FirstFree = Handle;
129 RtlIsValidHandle(PRTL_HANDLE_TABLE HandleTable,
132 if ((HandleTable != NULL)
134 && (Handle >= HandleTable->Handles)
135 && (Handle < HandleTable->Limit))
142 RtlIsValidIndexHandle(PRTL_HANDLE_TABLE HandleTable,
146 PRTL_HANDLE InternalHandle;
148 DPRINT("RtlIsValidIndexHandle(HandleTable %p Handle %p Index %x)\n", HandleTable, Handle, Index);
150 if (HandleTable == NULL)
153 DPRINT("Handles %p HandleSize %x\n",
154 HandleTable->Handles, HandleTable->HandleSize);
156 InternalHandle = (PRTL_HANDLE)((ULONG)HandleTable->Handles + (HandleTable->HandleSize * Index));
157 if (RtlIsValidHandle(HandleTable, InternalHandle) == FALSE)
160 DPRINT("InternalHandle %p\n", InternalHandle);
163 *Handle = InternalHandle;