1 /* COPYRIGHT: See COPYING in the top level directory
2 * PROJECT: ReactOS system libraries
3 * PURPOSE: Handle table
4 * FILE: lib/rtl/handle.c
5 * PROGRAMMER: Eric Kohl
8 /* INCLUDES *****************************************************************/
15 /* GLOBALS ******************************************************************/
19 RtlInitializeHandleTable(
22 PRTL_HANDLE_TABLE HandleTable
)
24 /* Initialize handle table */
25 memset(HandleTable
, 0, sizeof(RTL_HANDLE_TABLE
));
26 HandleTable
->MaximumNumberOfHandles
= TableSize
;
27 HandleTable
->SizeOfHandleTableEntry
= HandleSize
;
36 RtlDestroyHandleTable(
37 PRTL_HANDLE_TABLE HandleTable
)
42 /* free handle array */
43 if (HandleTable
->CommittedHandles
)
45 ArrayPointer
= (PVOID
)HandleTable
->CommittedHandles
;
46 NtFreeVirtualMemory(NtCurrentProcess(),
57 PRTL_HANDLE_TABLE_ENTRY
60 PRTL_HANDLE_TABLE HandleTable
,
63 PRTL_HANDLE_TABLE_ENTRY
*pp_new
, *pph
, ph
;
65 PRTL_HANDLE_TABLE_ENTRY retval
;
69 pp_new
= &HandleTable
->FreeHandles
;
71 if (HandleTable
->FreeHandles
== NULL
)
73 /* no free handle available */
74 if (HandleTable
->UnCommittedHandles
== NULL
)
76 /* allocate handle array */
77 ArraySize
= HandleTable
->SizeOfHandleTableEntry
* HandleTable
->MaximumNumberOfHandles
;
80 /* FIXME - only reserve handles here! */
81 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
82 (PVOID
*)&ArrayPointer
,
85 MEM_RESERVE
| MEM_COMMIT
,
87 if (!NT_SUCCESS(Status
))
90 /* update handle array pointers */
91 HandleTable
->FreeHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
92 HandleTable
->MaxReservedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ArrayPointer
+ ArraySize
);
93 HandleTable
->CommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
94 HandleTable
->UnCommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
97 /* FIXME - should check if handles need to be committed */
99 /* build free list in handle array */
100 ph
= HandleTable
->FreeHandles
;
102 while (ph
< HandleTable
->MaxReservedHandles
)
106 ph
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ph
+ HandleTable
->SizeOfHandleTableEntry
);
111 /* remove handle from free list */
113 *pp_new
= retval
->NextFree
;
114 retval
->NextFree
= NULL
;
118 *Index
= ((ULONG
)((ULONG_PTR
)retval
- (ULONG_PTR
)HandleTable
->CommittedHandles
) /
119 HandleTable
->SizeOfHandleTableEntry
);
132 PRTL_HANDLE_TABLE HandleTable
,
133 PRTL_HANDLE_TABLE_ENTRY Handle
)
136 /* check if handle is valid */
137 if (!RtlIsValidHandle(HandleTable
, Handle
))
139 DPRINT1("Invalid Handle! HandleTable=0x%p, Handle=0x%p, Handle->Flags=0x%x\n",
140 HandleTable
, Handle
, Handle
? Handle
->Flags
: 0);
146 memset(Handle
, 0, HandleTable
->SizeOfHandleTableEntry
);
148 /* add handle to free list */
149 Handle
->NextFree
= HandleTable
->FreeHandles
;
150 HandleTable
->FreeHandles
= Handle
;
162 PRTL_HANDLE_TABLE HandleTable
,
163 PRTL_HANDLE_TABLE_ENTRY Handle
)
165 if ((HandleTable
!= NULL
)
166 && (Handle
>= HandleTable
->CommittedHandles
)
167 && (Handle
< HandleTable
->MaxReservedHandles
)
168 && (Handle
->Flags
& RTL_HANDLE_VALID
))
181 RtlIsValidIndexHandle(
182 IN PRTL_HANDLE_TABLE HandleTable
,
184 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
)
186 PRTL_HANDLE_TABLE_ENTRY InternalHandle
;
188 DPRINT("RtlIsValidIndexHandle(HandleTable %p Index 0x%lx Handle %p)\n", HandleTable
, Index
, Handle
);
190 if (HandleTable
== NULL
)
193 DPRINT("Handles %p HandleSize 0x%lx\n",
194 HandleTable
->CommittedHandles
, HandleTable
->SizeOfHandleTableEntry
);
196 InternalHandle
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)HandleTable
->CommittedHandles
+
197 (HandleTable
->SizeOfHandleTableEntry
* Index
));
198 if (!RtlIsValidHandle(HandleTable
, InternalHandle
))
201 DPRINT("InternalHandle %p\n", InternalHandle
);
204 *Handle
= InternalHandle
;