From 3e76d8224e3d3a50d31e8efa9ad5837b88ca0616 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 6 Oct 2010 20:34:30 +0000 Subject: [PATCH] [NTDLL] - LoadImageFileExecutionOptions() improvements: * Apply certain heap flags if the process is being debugged (only if NtGlobalFlags is not overridden). * Implement enabling page heap and reading image-specific configuration values. - Add page heap configuration values to the Heap Manager. svn path=/trunk/; revision=49025 --- reactos/dll/ntdll/ldr/startup.c | 77 +++++++++++++++++++++++++++++++-- reactos/lib/rtl/heap_rewrite.c | 3 +- reactos/lib/rtl/heapdbg.c | 11 +++++ 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/reactos/dll/ntdll/ldr/startup.c b/reactos/dll/ntdll/ldr/startup.c index 4af6ebd7eb3..d0981c8d148 100644 --- a/reactos/dll/ntdll/ldr/startup.c +++ b/reactos/dll/ntdll/ldr/startup.c @@ -74,6 +74,10 @@ LoadImageFileExecutionOptions(PPEB Peb) UNICODE_STRING ImageName; UNICODE_STRING ImagePathName; ULONG ValueSize; + extern ULONG RtlpPageHeapGlobalFlags, RtlpPageHeapSizeRangeStart, RtlpPageHeapSizeRangeEnd; + extern ULONG RtlpPageHeapDllRangeStart, RtlpPageHeapDllRangeEnd; + extern WCHAR RtlpPageHeapTargetDlls[512]; + extern BOOLEAN RtlpPageHeapEnabled; if (Peb->ProcessParameters && Peb->ProcessParameters->ImagePathName.Length > 0) @@ -113,10 +117,75 @@ LoadImageFileExecutionOptions(PPEB Peb) Peb->NtGlobalFlag = Value; DPRINT("GlobalFlag: Value=0x%lx\n", Value); } - /* - * FIXME: - * read more options - */ + else + { + /* Add debugging flags if there is no GlobalFlags override */ + if (Peb->BeingDebugged) + { + Peb->NtGlobalFlag |= FLG_HEAP_VALIDATE_PARAMETERS | + FLG_HEAP_ENABLE_FREE_CHECK | + FLG_HEAP_ENABLE_TAIL_CHECK; + } + } + + /* Handle the case when page heap is enabled */ + if (Peb->NtGlobalFlag & FLG_HEAP_PAGE_ALLOCS) + { + /* Disable all heap debugging flags so that no heap call goes via page heap branch */ + Peb->NtGlobalFlag &= ~(FLG_HEAP_VALIDATE_PARAMETERS | + FLG_HEAP_VALIDATE_ALL | + FLG_HEAP_ENABLE_FREE_CHECK | + FLG_HEAP_ENABLE_TAIL_CHECK | + FLG_USER_STACK_TRACE_DB | + FLG_HEAP_ENABLE_TAGGING | + FLG_HEAP_ENABLE_TAG_BY_DLL); + } + + /* Get page heap flags without checking return value */ + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapFlags", + REG_DWORD, + (PVOID)&RtlpPageHeapGlobalFlags, + sizeof(RtlpPageHeapGlobalFlags), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapSizeRangeStart", + REG_DWORD, + (PVOID)&RtlpPageHeapSizeRangeStart, + sizeof(RtlpPageHeapSizeRangeStart), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapSizeRangeEnd", + REG_DWORD, + (PVOID)&RtlpPageHeapSizeRangeEnd, + sizeof(RtlpPageHeapSizeRangeEnd), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapDllRangeStart", + REG_DWORD, + (PVOID)&RtlpPageHeapDllRangeStart, + sizeof(RtlpPageHeapDllRangeStart), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapDllRangeEnd", + REG_DWORD, + (PVOID)&RtlpPageHeapDllRangeEnd, + sizeof(RtlpPageHeapDllRangeEnd), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapTargetDlls", + REG_SZ, + (PVOID)RtlpPageHeapTargetDlls, + sizeof(RtlpPageHeapTargetDlls), + &ValueSize); + + /* Now when all parameters are read, enable page heap */ + RtlpPageHeapEnabled = TRUE; } } diff --git a/reactos/lib/rtl/heap_rewrite.c b/reactos/lib/rtl/heap_rewrite.c index 606e25742bf..08629cc99ed 100644 --- a/reactos/lib/rtl/heap_rewrite.c +++ b/reactos/lib/rtl/heap_rewrite.c @@ -269,7 +269,6 @@ RtlpSpecialHeapCreate(ULONG Flags, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters) { return NULL; }; -BOOLEAN RtlpSpecialHeapEnabled = FALSE; HEAP_LOCK RtlpProcessHeapsListLock; PHEAP RtlpProcessHeaps[HEAP_MAX_PROCESS_HEAPS]; /* Usermode only */ @@ -1542,7 +1541,7 @@ RtlCreateHeap(ULONG Flags, BOOLEAN AllocateLock = FALSE; /* Check for a special heap */ - if (RtlpSpecialHeapEnabled && !Addr && !Lock) + if (RtlpPageHeapEnabled && !Addr && !Lock) { Heap = RtlpSpecialHeapCreate(Flags, Addr, TotalSize, CommitSize, Lock, Parameters); if (Heap) return Heap; diff --git a/reactos/lib/rtl/heapdbg.c b/reactos/lib/rtl/heapdbg.c index 5421fb0a3e3..d7bda960398 100644 --- a/reactos/lib/rtl/heapdbg.c +++ b/reactos/lib/rtl/heapdbg.c @@ -8,6 +8,17 @@ /* INCLUDES ******************************************************************/ +#include + +#define NDEBUG +#include + +BOOLEAN RtlpPageHeapEnabled = FALSE; +ULONG RtlpPageHeapGlobalFlags; +ULONG RtlpPageHeapSizeRangeStart, RtlpPageHeapSizeRangeEnd; +ULONG RtlpPageHeapDllRangeStart, RtlpPageHeapDllRangeEnd; +WCHAR RtlpPageHeapTargetDlls[512]; + /* FUNCTIONS ******************************************************************/ /* EOF */ \ No newline at end of file