#include <debug.h>
#define TAG_ATMT 'TotA' /* Atom table */
+#define TAG_RTHL 'LHtR' /* Heap Lock */
extern ULONG NtGlobalFlag;
KPROCESSOR_MODE
NTAPI
-RtlpGetMode()
+RtlpGetMode(VOID)
{
return KernelMode;
}
RtlDeleteHeapLock(IN OUT PHEAP_LOCK Lock)
{
ExDeleteResourceLite(&Lock->Resource);
- ExFreePool(Lock);
+ ExFreePoolWithTag(Lock, TAG_RTHL);
return STATUS_SUCCESS;
}
return STATUS_SUCCESS;
}
+BOOLEAN
+NTAPI
+RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
+{
+ BOOLEAN Success;
+ KeEnterCriticalRegion();
+
+ if (Exclusive)
+ Success = ExAcquireResourceExclusiveLite(&Lock->Resource, FALSE);
+ else
+ Success = ExAcquireResourceSharedLite(&Lock->Resource, FALSE);
+
+ if (!Success)
+ KeLeaveCriticalRegion();
+
+ return Success;
+}
+
NTSTATUS
NTAPI
RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock)
{
- PHEAP_LOCK HeapLock = ExAllocatePool(NonPagedPool, sizeof(HEAP_LOCK));
+ PHEAP_LOCK HeapLock = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(HEAP_LOCK),
+ TAG_RTHL);
if (HeapLock == NULL)
return STATUS_NO_MEMORY;
{
if(KeGetCurrentIrql() > APC_LEVEL)
{
- DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%d)\n", file, line, KeGetCurrentIrql());
+ DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%u)\n", file, line, KeGetCurrentIrql());
ASSERT(FALSE);
}
}
#endif
/* Validate them */
- if (StackEnd <= StackBegin) return 0;
+ if (StackEnd <= StackBegin) _SEH2_YIELD(return 0);
ProbeForRead((PVOID)StackBegin,
StackEnd - StackBegin,
sizeof(CHAR));
#endif
-#ifdef _AMD64_
+#if defined(_M_AMD64) || defined(_M_ARM)
VOID
NTAPI
RtlpGetStackLimits(
return (AtomTable->ExHandleTable != NULL);
}
+BOOLEAN
+NTAPI
+RtlpCloseHandleCallback(
+ IN PHANDLE_TABLE_ENTRY HandleTableEntry,
+ IN HANDLE Handle,
+ IN PVOID HandleTable)
+{
+ /* Destroy and unlock the handle entry */
+ return ExDestroyHandle(HandleTable, Handle, HandleTableEntry);
+}
+
VOID
RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable)
{
if (AtomTable->ExHandleTable)
{
ExSweepHandleTable(AtomTable->ExHandleTable,
- NULL,
- NULL);
+ RtlpCloseHandleCallback,
+ AtomTable->ExHandleTable);
ExDestroyHandleTable(AtomTable->ExHandleTable, NULL);
AtomTable->ExHandleTable = NULL;
}
PRTL_ATOM_TABLE
RtlpAllocAtomTable(ULONG Size)
{
- PRTL_ATOM_TABLE Table = ExAllocatePool(NonPagedPool,
- Size);
+ PRTL_ATOM_TABLE Table = ExAllocatePoolWithTag(NonPagedPool,
+ Size,
+ TAG_ATMT);
if (Table != NULL)
{
RtlZeroMemory(Table,
VOID
RtlpFreeAtomTable(PRTL_ATOM_TABLE AtomTable)
{
- ExFreePool(AtomTable);
+ ExFreePoolWithTag(AtomTable, TAG_ATMT);
}
PRTL_ATOM_TABLE_ENTRY
root = RtlImageDirectoryEntryToData( BaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_RESOURCE, &size );
if (!root) return STATUS_RESOURCE_DATA_NOT_FOUND;
+ if (size < sizeof(*resdirptr)) return STATUS_RESOURCE_DATA_NOT_FOUND;
resdirptr = root;
if (!level--) goto done;
BOOLEAN
NTAPI
-RtlCallVectoredExceptionHandlers(
- _In_ PEXCEPTION_RECORD ExceptionRecord,
- _In_ PCONTEXT Context)
+RtlCallVectoredExceptionHandlers(_In_ PEXCEPTION_RECORD ExceptionRecord,
+ _In_ PCONTEXT Context)
{
/* In the kernel we don't have vectored exception handlers */
return FALSE;
}
+VOID
+NTAPI
+RtlCallVectoredContinueHandlers(_In_ PEXCEPTION_RECORD ExceptionRecord,
+ _In_ PCONTEXT Context)
+{
+ /* No vectored continue handlers either in kernel mode */
+ return;
+}
+
/* EOF */