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
;
82 RtlDeleteCriticalSection(
83 PRTL_CRITICAL_SECTION CriticalSection
)
85 return STATUS_SUCCESS
;
90 RtlSetCriticalSectionSpinCount(
91 PRTL_CRITICAL_SECTION CriticalSection
,
100 RtlEnterCriticalSection(
101 PRTL_CRITICAL_SECTION CriticalSection
)
103 ExAcquireFastMutex((PFAST_MUTEX
) CriticalSection
);
104 return STATUS_SUCCESS
;
109 RtlInitializeCriticalSection(
110 PRTL_CRITICAL_SECTION CriticalSection
)
112 ExInitializeFastMutex((PFAST_MUTEX
)CriticalSection
);
113 return STATUS_SUCCESS
;
118 RtlLeaveCriticalSection(
119 PRTL_CRITICAL_SECTION CriticalSection
)
121 ExReleaseFastMutex((PFAST_MUTEX
) CriticalSection
);
122 return STATUS_SUCCESS
;
127 RtlTryEnterCriticalSection(
128 PRTL_CRITICAL_SECTION CriticalSection
)
130 return ExTryToAcquireFastMutex((PFAST_MUTEX
) CriticalSection
);
136 RtlInitializeCriticalSectionAndSpinCount(
137 PRTL_CRITICAL_SECTION CriticalSection
,
140 ExInitializeFastMutex((PFAST_MUTEX
)CriticalSection
);
141 return STATUS_SUCCESS
;
147 CHECK_PAGED_CODE_RTL(char *file
, int line
)
149 if(KeGetCurrentIrql() > APC_LEVEL
)
151 DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%d)\n", file
, line
, KeGetCurrentIrql());
157 /* RTL Atom Tables ************************************************************/
160 RtlpInitAtomTableLock(PRTL_ATOM_TABLE AtomTable
)
162 ExInitializeFastMutex(&AtomTable
->FastMutex
);
164 return STATUS_SUCCESS
;
169 RtlpDestroyAtomTableLock(PRTL_ATOM_TABLE AtomTable
)
175 RtlpLockAtomTable(PRTL_ATOM_TABLE AtomTable
)
177 ExAcquireFastMutex(&AtomTable
->FastMutex
);
182 RtlpUnlockAtomTable(PRTL_ATOM_TABLE AtomTable
)
184 ExReleaseFastMutex(&AtomTable
->FastMutex
);
188 RtlpCreateAtomHandleTable(PRTL_ATOM_TABLE AtomTable
)
190 AtomTable
->ExHandleTable
= ExCreateHandleTable(NULL
);
191 return (AtomTable
->ExHandleTable
!= NULL
);
195 AtomDeleteHandleCallback(PHANDLE_TABLE HandleTable
,
204 RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable
)
206 if (AtomTable
->ExHandleTable
)
208 ExDestroyHandleTable(AtomTable
->ExHandleTable
,
209 AtomDeleteHandleCallback
,
211 AtomTable
->ExHandleTable
= NULL
;
216 RtlpAllocAtomTable(ULONG Size
)
218 PRTL_ATOM_TABLE Table
= ExAllocatePool(NonPagedPool
,
230 RtlpFreeAtomTable(PRTL_ATOM_TABLE AtomTable
)
232 ExFreePool(AtomTable
);
235 PRTL_ATOM_TABLE_ENTRY
236 RtlpAllocAtomTableEntry(ULONG Size
)
238 PRTL_ATOM_TABLE_ENTRY Entry
= ExAllocatePool(NonPagedPool
,
250 RtlpFreeAtomTableEntry(PRTL_ATOM_TABLE_ENTRY Entry
)
256 RtlpFreeAtomHandle(PRTL_ATOM_TABLE AtomTable
, PRTL_ATOM_TABLE_ENTRY Entry
)
258 ExDestroyHandle(AtomTable
->ExHandleTable
,
259 (HANDLE
)((ULONG_PTR
)Entry
->HandleIndex
<< 2));
263 RtlpCreateAtomHandle(PRTL_ATOM_TABLE AtomTable
, PRTL_ATOM_TABLE_ENTRY Entry
)
265 HANDLE_TABLE_ENTRY ExEntry
;
269 ExEntry
.u1
.Object
= Entry
;
270 ExEntry
.u2
.GrantedAccess
= 0x1; /* FIXME - valid handle */
272 Handle
= ExCreateHandle(AtomTable
->ExHandleTable
,
276 HandleIndex
= (USHORT
)((ULONG_PTR
)Handle
>> 2);
277 /* FIXME - Handle Indexes >= 0xC000 ?! */
278 if ((ULONG_PTR
)HandleIndex
>> 2 < 0xC000)
280 Entry
->HandleIndex
= HandleIndex
;
281 Entry
->Atom
= 0xC000 + HandleIndex
;
286 ExDestroyHandle(AtomTable
->ExHandleTable
,
293 PRTL_ATOM_TABLE_ENTRY
294 RtlpGetAtomEntry(PRTL_ATOM_TABLE AtomTable
, ULONG Index
)
296 PHANDLE_TABLE_ENTRY ExEntry
;
297 PRTL_ATOM_TABLE_ENTRY Entry
= NULL
;
299 /* NOTE: There's no need to explicitly enter a critical region because it's
300 guaranteed that we're in a critical region right now (as we hold
301 the atom table lock) */
303 ExEntry
= ExMapHandleToPointer(AtomTable
->ExHandleTable
,
304 (HANDLE
)((ULONG_PTR
)Index
<< 2));
307 Entry
= ExEntry
->u1
.Object
;
309 ExUnlockHandleTableEntry(AtomTable
->ExHandleTable
,
316 /* FIXME - RtlpCreateUnicodeString is obsolete and should be removed ASAP! */
318 RtlpCreateUnicodeString(
319 IN OUT PUNICODE_STRING UniDest
,
321 IN POOL_TYPE PoolType
)
325 Length
= (wcslen (Source
) + 1) * sizeof(WCHAR
);
326 UniDest
->Buffer
= ExAllocatePoolWithTag(PoolType
, Length
, TAG('U', 'S', 'T', 'R'));
327 if (UniDest
->Buffer
== NULL
)
330 RtlCopyMemory (UniDest
->Buffer
,
334 UniDest
->MaximumLength
= Length
;
335 UniDest
->Length
= Length
- sizeof (WCHAR
);