1 /* COPYRIGHT: See COPYING in the top level directory
2 * PROJECT: ReactOS system libraries
3 * PURPOSE: Handle table
4 * FILE: lib/rtl/handle.c
8 /* INCLUDES *****************************************************************/
15 /* GLOBALS ******************************************************************/
18 RtlInitializeHandleTable(ULONG TableSize
,
20 PRTL_HANDLE_TABLE HandleTable
)
22 /* initialize handle table */
25 sizeof(RTL_HANDLE_TABLE
));
26 HandleTable
->MaximumNumberOfHandles
= TableSize
;
27 HandleTable
->SizeOfHandleTableEntry
= HandleSize
;
35 RtlDestroyHandleTable(PRTL_HANDLE_TABLE HandleTable
)
40 /* free handle array */
41 if (HandleTable
->CommittedHandles
)
43 ArrayPointer
= (PVOID
)HandleTable
->CommittedHandles
;
44 ArraySize
= HandleTable
->SizeOfHandleTableEntry
* HandleTable
->MaximumNumberOfHandles
;
45 NtFreeVirtualMemory(NtCurrentProcess(),
56 PRTL_HANDLE_TABLE_ENTRY NTAPI
57 RtlAllocateHandle(PRTL_HANDLE_TABLE HandleTable
,
60 PRTL_HANDLE_TABLE_ENTRY
*pp_new
, *pph
, ph
;
62 PRTL_HANDLE_TABLE_ENTRY retval
;
66 pp_new
= &HandleTable
->FreeHandles
;
68 if (HandleTable
->FreeHandles
== NULL
)
70 /* no free handle available */
71 if (HandleTable
->UnCommittedHandles
== NULL
)
73 /* allocate handle array */
74 ArraySize
= HandleTable
->SizeOfHandleTableEntry
* HandleTable
->MaximumNumberOfHandles
;
77 /* FIXME - only reserve handles here! */
78 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
79 (PVOID
*)&ArrayPointer
,
82 MEM_RESERVE
| MEM_COMMIT
,
84 if (!NT_SUCCESS(Status
))
87 /* update handle array pointers */
88 HandleTable
->FreeHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
89 HandleTable
->MaxReservedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ArrayPointer
+ ArraySize
);
90 HandleTable
->CommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
91 HandleTable
->UnCommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
94 /* FIXME - should check if handles need to be committed */
96 /* build free list in handle array */
97 ph
= HandleTable
->FreeHandles
;
99 while (ph
< HandleTable
->MaxReservedHandles
)
103 ph
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ph
+ HandleTable
->SizeOfHandleTableEntry
);
108 /* remove handle from free list */
110 *pp_new
= retval
->NextFree
;
111 retval
->NextFree
= NULL
;
114 *Index
= ((ULONG
)((ULONG_PTR
)retval
- (ULONG_PTR
)HandleTable
->CommittedHandles
) /
115 HandleTable
->SizeOfHandleTableEntry
);
125 RtlFreeHandle(PRTL_HANDLE_TABLE HandleTable
,
126 PRTL_HANDLE_TABLE_ENTRY Handle
)
129 /* check if handle is valid */
130 if (!RtlIsValidHandle(HandleTable
, Handle
))
132 DPRINT1("Invalid Handle! HandleTable=0x%p, Handle=0x%p, Handle->Flags=0x%x\n",
133 HandleTable
, Handle
, Handle
? Handle
->Flags
: 0);
139 memset(Handle
, 0, HandleTable
->SizeOfHandleTableEntry
);
141 /* add handle to free list */
142 Handle
->NextFree
= HandleTable
->FreeHandles
;
143 HandleTable
->FreeHandles
= Handle
;
153 RtlIsValidHandle(PRTL_HANDLE_TABLE HandleTable
,
154 PRTL_HANDLE_TABLE_ENTRY Handle
)
156 if ((HandleTable
!= NULL
)
157 && (Handle
>= HandleTable
->CommittedHandles
)
158 && (Handle
< HandleTable
->MaxReservedHandles
)
159 && (Handle
->Flags
& RTL_HANDLE_VALID
))
169 RtlIsValidIndexHandle(IN PRTL_HANDLE_TABLE HandleTable
,
171 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
)
173 PRTL_HANDLE_TABLE_ENTRY InternalHandle
;
175 DPRINT("RtlIsValidIndexHandle(HandleTable %p Index 0x%lx Handle %p)\n", HandleTable
, Index
, Handle
);
177 if (HandleTable
== NULL
)
180 DPRINT("Handles %p HandleSize 0x%lx\n",
181 HandleTable
->CommittedHandles
, HandleTable
->SizeOfHandleTableEntry
);
183 InternalHandle
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)HandleTable
->CommittedHandles
+
184 (HandleTable
->SizeOfHandleTableEntry
* Index
));
185 if (!RtlIsValidHandle(HandleTable
, InternalHandle
))
188 DPRINT("InternalHandle %p\n", InternalHandle
);
191 *Handle
= InternalHandle
;