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 NtFreeVirtualMemory(NtCurrentProcess(),
55 PRTL_HANDLE_TABLE_ENTRY NTAPI
56 RtlAllocateHandle(PRTL_HANDLE_TABLE HandleTable
,
59 PRTL_HANDLE_TABLE_ENTRY
*pp_new
, *pph
, ph
;
61 PRTL_HANDLE_TABLE_ENTRY retval
;
65 pp_new
= &HandleTable
->FreeHandles
;
67 if (HandleTable
->FreeHandles
== NULL
)
69 /* no free handle available */
70 if (HandleTable
->UnCommittedHandles
== NULL
)
72 /* allocate handle array */
73 ArraySize
= HandleTable
->SizeOfHandleTableEntry
* HandleTable
->MaximumNumberOfHandles
;
76 /* FIXME - only reserve handles here! */
77 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
78 (PVOID
*)&ArrayPointer
,
81 MEM_RESERVE
| MEM_COMMIT
,
83 if (!NT_SUCCESS(Status
))
86 /* update handle array pointers */
87 HandleTable
->FreeHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
88 HandleTable
->MaxReservedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ArrayPointer
+ ArraySize
);
89 HandleTable
->CommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
90 HandleTable
->UnCommittedHandles
= (PRTL_HANDLE_TABLE_ENTRY
)ArrayPointer
;
93 /* FIXME - should check if handles need to be committed */
95 /* build free list in handle array */
96 ph
= HandleTable
->FreeHandles
;
98 while (ph
< HandleTable
->MaxReservedHandles
)
102 ph
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)ph
+ HandleTable
->SizeOfHandleTableEntry
);
107 /* remove handle from free list */
109 *pp_new
= retval
->NextFree
;
110 retval
->NextFree
= NULL
;
113 *Index
= ((ULONG
)((ULONG_PTR
)retval
- (ULONG_PTR
)HandleTable
->CommittedHandles
) /
114 HandleTable
->SizeOfHandleTableEntry
);
124 RtlFreeHandle(PRTL_HANDLE_TABLE HandleTable
,
125 PRTL_HANDLE_TABLE_ENTRY Handle
)
128 /* check if handle is valid */
129 if (!RtlIsValidHandle(HandleTable
, Handle
))
131 DPRINT1("Invalid Handle! HandleTable=0x%p, Handle=0x%p, Handle->Flags=0x%x\n",
132 HandleTable
, Handle
, Handle
? Handle
->Flags
: 0);
138 memset(Handle
, 0, HandleTable
->SizeOfHandleTableEntry
);
140 /* add handle to free list */
141 Handle
->NextFree
= HandleTable
->FreeHandles
;
142 HandleTable
->FreeHandles
= Handle
;
152 RtlIsValidHandle(PRTL_HANDLE_TABLE HandleTable
,
153 PRTL_HANDLE_TABLE_ENTRY Handle
)
155 if ((HandleTable
!= NULL
)
156 && (Handle
>= HandleTable
->CommittedHandles
)
157 && (Handle
< HandleTable
->MaxReservedHandles
)
158 && (Handle
->Flags
& RTL_HANDLE_VALID
))
168 RtlIsValidIndexHandle(IN PRTL_HANDLE_TABLE HandleTable
,
170 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
)
172 PRTL_HANDLE_TABLE_ENTRY InternalHandle
;
174 DPRINT("RtlIsValidIndexHandle(HandleTable %p Index 0x%lx Handle %p)\n", HandleTable
, Index
, Handle
);
176 if (HandleTable
== NULL
)
179 DPRINT("Handles %p HandleSize 0x%lx\n",
180 HandleTable
->CommittedHandles
, HandleTable
->SizeOfHandleTableEntry
);
182 InternalHandle
= (PRTL_HANDLE_TABLE_ENTRY
)((ULONG_PTR
)HandleTable
->CommittedHandles
+
183 (HandleTable
->SizeOfHandleTableEntry
* Index
));
184 if (!RtlIsValidHandle(HandleTable
, InternalHandle
))
187 DPRINT("InternalHandle %p\n", InternalHandle
);
190 *Handle
= InternalHandle
;