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 * PROGRAMER: Eric Kohl <ekohl@rz-online.de>
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
))
135 memset(Handle
, 0, HandleTable
->SizeOfHandleTableEntry
);
137 /* add handle to free list */
138 Handle
->NextFree
= HandleTable
->FreeHandles
;
139 HandleTable
->FreeHandles
= Handle
;
149 RtlIsValidHandle(PRTL_HANDLE_TABLE HandleTable
,
150 PRTL_HANDLE_TABLE_ENTRY Handle
)
152 if ((HandleTable
!= NULL
)
153 && (Handle
>= HandleTable
->CommittedHandles
)
154 && (Handle
< HandleTable
->MaxReservedHandles
)
155 && (Handle
->Flags
& RTL_HANDLE_VALID
))
165 RtlIsValidIndexHandle(IN PRTL_HANDLE_TABLE HandleTable
,
167 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
)
169 PRTL_HANDLE_TABLE_ENTRY InternalHandle
;
171 DPRINT("RtlIsValidIndexHandle(HandleTable %p Index %x Handle %p)\n", HandleTable
, Index
, Handle
);
173 if (HandleTable
== NULL
)
176 DPRINT("Handles %p HandleSize %x\n",
177 HandleTable
->CommittedHandles
, HandleTable
->SizeOfHandleTableEntry
);
179 InternalHandle
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)HandleTable
->CommittedHandles
+
180 (HandleTable
->SizeOfHandleTableEntry
* Index
));
181 if (!RtlIsValidHandle(HandleTable
, InternalHandle
))
184 DPRINT("InternalHandle %p\n", InternalHandle
);
187 *Handle
= InternalHandle
;