3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/rtl/libsupp.c
6 * PURPOSE: Rtl library support routines
8 * PROGRAMMERS: No programmer listed.
11 /* INCLUDES ******************************************************************/
15 #include <internal/debug.h>
17 /* FUNCTIONS *****************************************************************/
29 RtlpAllocateMemory(UINT Bytes
,
32 return ExAllocatePoolWithTag(PagedPool
,
40 RtlpFreeMemory(PVOID Mem
,
43 ExFreePoolWithTag(Mem
,
51 RtlAcquirePebLock(VOID
)
60 RtlReleasePebLock(VOID
)
67 LdrShutdownThread(VOID
)
69 return STATUS_SUCCESS
;
77 return ((PEPROCESS
)(KeGetCurrentThread()->ApcState
.Process
))->Peb
;
83 PRTL_CRITICAL_SECTION CriticalSection
)
85 return STATUS_SUCCESS
;
91 PRTL_CRITICAL_SECTION CriticalSection
)
93 ExAcquireFastMutex((PFAST_MUTEX
) CriticalSection
);
94 return STATUS_SUCCESS
;
99 RtlInitializeHeapLock(
100 PRTL_CRITICAL_SECTION CriticalSection
)
102 ExInitializeFastMutex((PFAST_MUTEX
)CriticalSection
);
103 return STATUS_SUCCESS
;
109 PRTL_CRITICAL_SECTION CriticalSection
)
111 ExReleaseFastMutex((PFAST_MUTEX
) CriticalSection
);
112 return STATUS_SUCCESS
;
117 CHECK_PAGED_CODE_RTL(char *file
, int line
)
119 if(KeGetCurrentIrql() > APC_LEVEL
)
121 DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%d)\n", file
, line
, KeGetCurrentIrql());
127 /* RTL Atom Tables ************************************************************/
130 RtlpInitAtomTableLock(PRTL_ATOM_TABLE AtomTable
)
132 ExInitializeFastMutex(&AtomTable
->FastMutex
);
134 return STATUS_SUCCESS
;
139 RtlpDestroyAtomTableLock(PRTL_ATOM_TABLE AtomTable
)
145 RtlpLockAtomTable(PRTL_ATOM_TABLE AtomTable
)
147 ExAcquireFastMutex(&AtomTable
->FastMutex
);
152 RtlpUnlockAtomTable(PRTL_ATOM_TABLE AtomTable
)
154 ExReleaseFastMutex(&AtomTable
->FastMutex
);
158 RtlpCreateAtomHandleTable(PRTL_ATOM_TABLE AtomTable
)
160 AtomTable
->ExHandleTable
= ExCreateHandleTable(NULL
);
161 return (AtomTable
->ExHandleTable
!= NULL
);
165 AtomDeleteHandleCallback(PHANDLE_TABLE HandleTable
,
174 RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable
)
176 if (AtomTable
->ExHandleTable
)
178 ExDestroyHandleTable(AtomTable
->ExHandleTable
,
179 AtomDeleteHandleCallback
,
181 AtomTable
->ExHandleTable
= NULL
;
186 RtlpAllocAtomTable(ULONG Size
)
188 PRTL_ATOM_TABLE Table
= ExAllocatePool(NonPagedPool
,
200 RtlpFreeAtomTable(PRTL_ATOM_TABLE AtomTable
)
202 ExFreePool(AtomTable
);
205 PRTL_ATOM_TABLE_ENTRY
206 RtlpAllocAtomTableEntry(ULONG Size
)
208 PRTL_ATOM_TABLE_ENTRY Entry
= ExAllocatePool(NonPagedPool
,
220 RtlpFreeAtomTableEntry(PRTL_ATOM_TABLE_ENTRY Entry
)
226 RtlpFreeAtomHandle(PRTL_ATOM_TABLE AtomTable
, PRTL_ATOM_TABLE_ENTRY Entry
)
228 ExDestroyHandle(AtomTable
->ExHandleTable
,
229 (HANDLE
)((ULONG_PTR
)Entry
->HandleIndex
<< 2));
233 RtlpCreateAtomHandle(PRTL_ATOM_TABLE AtomTable
, PRTL_ATOM_TABLE_ENTRY Entry
)
235 HANDLE_TABLE_ENTRY ExEntry
;
239 ExEntry
.u1
.Object
= Entry
;
240 ExEntry
.u2
.GrantedAccess
= 0x1; /* FIXME - valid handle */
242 Handle
= ExCreateHandle(AtomTable
->ExHandleTable
,
246 HandleIndex
= (USHORT
)((ULONG_PTR
)Handle
>> 2);
247 /* FIXME - Handle Indexes >= 0xC000 ?! */
248 if ((ULONG_PTR
)HandleIndex
>> 2 < 0xC000)
250 Entry
->HandleIndex
= HandleIndex
;
251 Entry
->Atom
= 0xC000 + HandleIndex
;
256 ExDestroyHandle(AtomTable
->ExHandleTable
,
263 PRTL_ATOM_TABLE_ENTRY
264 RtlpGetAtomEntry(PRTL_ATOM_TABLE AtomTable
, ULONG Index
)
266 PHANDLE_TABLE_ENTRY ExEntry
;
267 PRTL_ATOM_TABLE_ENTRY Entry
= NULL
;
269 /* NOTE: There's no need to explicitly enter a critical region because it's
270 guaranteed that we're in a critical region right now (as we hold
271 the atom table lock) */
273 ExEntry
= ExMapHandleToPointer(AtomTable
->ExHandleTable
,
274 (HANDLE
)((ULONG_PTR
)Index
<< 2));
277 Entry
= ExEntry
->u1
.Object
;
279 ExUnlockHandleTableEntry(AtomTable
->ExHandleTable
,
286 /* FIXME - RtlpCreateUnicodeString is obsolete and should be removed ASAP! */
288 RtlpCreateUnicodeString(
289 IN OUT PUNICODE_STRING UniDest
,
291 IN POOL_TYPE PoolType
)
295 Length
= (wcslen (Source
) + 1) * sizeof(WCHAR
);
296 UniDest
->Buffer
= ExAllocatePoolWithTag(PoolType
, Length
, TAG('U', 'S', 'T', 'R'));
297 if (UniDest
->Buffer
== NULL
)
300 RtlCopyMemory (UniDest
->Buffer
,
304 UniDest
->MaximumLength
= Length
;
305 UniDest
->Length
= Length
- sizeof (WCHAR
);