134 #define DPH_RESERVE_SIZE 0x100000 135 #define DPH_POOL_SIZE 0x4000 136 #define DPH_FREE_LIST_MINIMUM 8 139 #define DPH_BREAK_ON_RESERVE_FAIL 0x01 140 #define DPH_BREAK_ON_COMMIT_FAIL 0x02 141 #define DPH_BREAK_ON_RELEASE_FAIL 0x04 142 #define DPH_BREAK_ON_FREE_FAIL 0x08 143 #define DPH_BREAK_ON_PROTECT_FAIL 0x10 144 #define DPH_BREAK_ON_NULL_FREE 0x80 147 #define DPH_DEBUG_INTERNAL_VALIDATE 0x01 148 #define DPH_DEBUG_VERBOSE 0x04 151 #define DPH_EXTRA_LOG_STACK_TRACES 0x02 152 #define DPH_EXTRA_CHECK_UNDERRUN 0x10 155 #define DPH_FILL 0xEEEEEEEE 156 #define DPH_FILL_START_STAMP_1 0xABCDBBBB 157 #define DPH_FILL_START_STAMP_2 0xABCDBBBA 158 #define DPH_FILL_END_STAMP_1 0xDCBABBBB 159 #define DPH_FILL_END_STAMP_2 0xDCBABBBA 160 #define DPH_FILL_SUFFIX 0xD0 161 #define DPH_FILL_INFIX 0xC0 164 #define DPH_VALINFO_BAD_START_STAMP 0x01 165 #define DPH_VALINFO_BAD_END_STAMP 0x02 166 #define DPH_VALINFO_BAD_POINTER 0x04 167 #define DPH_VALINFO_BAD_PREFIX_PATTERN 0x08 168 #define DPH_VALINFO_BAD_SUFFIX_PATTERN 0x10 169 #define DPH_VALINFO_EXCEPTION 0x20 170 #define DPH_VALINFO_1 0x40 171 #define DPH_VALINFO_BAD_INFIX_PATTERN 0x80 172 #define DPH_VALINFO_ALREADY_FREED 0x100 173 #define DPH_VALINFO_CORRUPTED_AFTER_FREE 0x200 176 #define DPH_SIGNATURE 0xFFEEDDCC 179 #define IS_BIASED_POINTER(ptr) ((ULONG_PTR)(ptr) & 1) 180 #define POINTER_REMOVE_BIAS(ptr) ((ULONG_PTR)(ptr) & ~(ULONG_PTR)1) 181 #define POINTER_ADD_BIAS(ptr) ((ULONG_PTR)(ptr) | 1) 234 DPRINT1(
"heap handle with incorrect signature\n");
270 DPRINT1(
"multithreaded access in HEAP_NO_SERIALIZE heap\n");
307 if (!DphRoot)
return;
450 BlockInfo->
Heap = DphRoot;
470 PVOID AddressUserData;
472 DPRINT(
"RtlpDphPlaceOnBusyList(%p %p)\n", DphRoot, DphNode);
493 DPRINT(
"RtlpDphPlaceOnFreeList(%p %p)\n", DphRoot,
Node);
513 DPRINT(
"RtlpDphPlaceOnPoolList(%p %p)\n", DphRoot,
Node);
533 DPRINT(
"RtlpDphPlaceOnVirtualList(%p %p)\n", DphRoot,
Node);
552 DPRINT(
"RtlpDphTakeNodeFromUnusedList(%p), ret %p\n", DphRoot,
Node);
558 Next =
Node->pNextAlloc;
572 DPRINT(
"RtlpDphReturnNodeToUnusedList(%p, %p)\n", DphRoot,
Node);
592 DPRINT(
"RtlpDphRemoveFromAvailableList(%p %p)\n", DphRoot,
Node);
608 if (NodeEntry ==
Node)
614 CurEntry = CurEntry->
Flink;
619 DPRINT1(
"Trying to remove non-existing in availlist node!\n");
643 DPRINT(
"RtlpDphRemoveFromBusyList(%p %p)\n", DphRoot,
Node);
662 DPRINT(
"RtlpDphRemoveFromFreeList(%p %p %p)\n", DphRoot,
Node, Prev);
665 Next =
Node->pNextAlloc;
687 DPRINT(
"RtlpDphCoalesceNodeIntoAvailable(%p %p)\n", DphRoot,
Node);
697 CurEntry = AvailListHead->
Flink;
699 while (CurEntry != AvailListHead)
704 PrevNode = NodeEntry;
707 CurEntry = CurEntry->
Flink;
729 sizeof(MemoryBasicInfo),
757 if (
Node->AvailableEntry.Flink != AvailListHead)
761 if (
Node->pVirtualBlock +
Node->nVirtualBlockSize == NextNode->pVirtualBlock)
769 NextNode->pVirtualBlock,
772 sizeof(MemoryBasicInfo),
781 Node->nVirtualBlockSize += NextNode->nVirtualBlockSize;
795 ULONG LeaveOnFreeList)
801 ASSERT(FreeAllocations >= LeaveOnFreeList);
803 DPRINT(
"RtlpDphCoalesceFreeIntoAvailable(%p %lu)\n", DphRoot, LeaveOnFreeList);
808 if (FreeAllocations < LeaveOnFreeList)
break;
811 Next =
Node->pNextAlloc;
832 DphStartNode = Virtual;
835 for (DphNode = Virtual,
i=NodeCount-1;
i > 0;
i--)
886 if (
Node->nVirtualBlockSize >=
Size)
893 CurEntry = CurEntry->
Flink;
1046 SizeVirtual =
Node->nVirtualBlockSize;
1058 SizeVirtual = 0x10000;
1089 if (
Node->nVirtualBlockSize >
Size)
1107 Node->nVirtualBlockSize = SizeVirtual;
1112 Node->nVirtualBlockSize = SizeVirtual -
Size;
1169 Node->nVirtualBlockSize = VirtualSize;
1192 if (FirstBlock < SecondBlock)
1194 else if (FirstBlock > SecondBlock)
1238 DPRINT1(
"Failure initializing delayed free queue critical section\n");
1259 ULONG ValidationInfo;
1272 Next = Current->
Flink;
1277 if (BlockInfo->
Heap == DphRoot)
1335 DPRINT1(
"Corrupted heap block %p\n", Block);
1344 DPRINT1(
"ERROR: Could not read DPH_BLOCK_INFORMATION\n");
1360 Block,
"Heap block",
Size,
"Block size", 0,
"");
1375 SafeInfo.
Heap,
"Actual heap handle");
1382 "Heap handle used", Block,
"Heap block",
Size,
"Block size", 0,
"");
1389 "Heap handle used", Block,
"Heap block",
Size,
"Block size", 0,
"");
1397 "Corrupted start stamp");
1405 "Corrupted end stamp");
1419 PULONG ValidationInformation,
1427 *ValidationInformation = 0;
1436 SomethingWrong =
TRUE;
1442 *ValidationInformation = 0x101;
1449 SomethingWrong =
TRUE;
1453 if (BlockInfo->
Heap != DphRoot)
1456 SomethingWrong =
TRUE;
1470 SomethingWrong =
TRUE;
1476 return (SomethingWrong ==
FALSE);
1481 PULONG ValidationInformation,
1487 *ValidationInformation = 0;
1517 DPRINT1(
"Page heap: pid 0x%p: page heap enabled with flags 0x%X.\n",
1661 DPRINT1(
"Page heap: process 0x%p created heap @ %p (%p, flags 0x%X)\n",
1683 if (HeapPtr == RtlGetProcessHeap())
1691 if (!DphRoot)
return NULL;
1740 Next =
Node->pNextAlloc;
1751 DPRINT1(
"Page heap: process 0x%p destroyed heap @ %p (%p)\n",
1765 ULONG AllocateSize, AccessSize;
1771 if (
Size > 0x7FF00000)
1773 DPRINT1(
"extreme size request\n");
1790 if (!DphRoot)
return NULL;
1824 DPRINT1(
"Page heap: Unable to allocate virtual memory\n");
1864 BusyNode = AvailableNode;
1869 UserActualSize =
Size;
1929 ULONG ValidationInfo;
1937 DPRINT1(
"Page heap: freeing a null pointer\n");
1945 if (!DphRoot)
return FALSE;
1976 if (
Node->nVirtualAccessSize != 0)
1989 if (
Node->nVirtualAccessSize != 0)
2023 ULONG ValidationInfo;
2028 if (
Size > 0x7FF00000)
2030 DPRINT1(
"extreme size request\n");
2047 if (!DphRoot)
return NULL;
2081 OldBlockPageHeap =
FALSE;
2100 UseNormalHeap =
TRUE;
2129 if (AllocatedNode->nUserRequestedSize >
Size)
2132 DataSize = AllocatedNode->nUserRequestedSize;
2144 Node->UserValue = AllocatedNode->UserValue;
2148 Node->UserFlags = AllocatedNode->UserFlags;
2151 if (!OldBlockPageHeap)
2158 if (AllocatedNode->nVirtualAccessSize != 0)
2167 AllocatedNode->StackTrace =
NULL;
2178 DPRINT(
"Allocated new user block pointer: %p\n", NewAlloc);
2196 if (!DphRoot)
return FALSE;
2216 if (UserValue) *UserValue =
Node->UserValue;
2217 if (UserFlags) *UserFlags =
Node->UserFlags;
2237 if (!DphRoot)
return FALSE;
2257 Node->UserValue = UserValue;
2271 ULONG UserFlagsReset,
2279 if (!DphRoot)
return FALSE;
2299 Node->UserFlags &= ~(UserFlagsReset);
2300 Node->UserFlags |= UserFlagsSet;
2320 if (!DphRoot)
return -1;
2361 if (!DphRoot)
return -1;
2421 if (!DphRoot)
return FALSE;
2435 if (!DphRoot)
return FALSE;
#define DPH_BREAK_ON_FREE_FAIL
struct _LIST_ENTRY * PLIST_ENTRY
#define DPH_DEBUG_VERBOSE
NTSYSAPI NTSTATUS NTAPI ZwQueryPerformanceCounter(_Out_ PLARGE_INTEGER Counter, _Out_opt_ PLARGE_INTEGER Frequency)
#define APPLICATION_VERIFIER_CORRUPTED_SUFFIX_PATTERN
NTSTATUS NTAPI RtlpDphProcessStartupInitialization(VOID)
struct _DPH_HEAP_BLOCK DPH_HEAP_BLOCK
LIST_ENTRY AvailableAllocationHead
#define DPH_VALINFO_EXCEPTION
struct _DPH_HEAP_ROOT * PDPH_HEAP_ROOT
BOOLEAN NTAPI RtlpDphIsNormalFreeHeapBlock(PVOID Block, PULONG ValidationInformation, BOOLEAN CheckFillers)
PHEAP_LOCK RtlpDphPageHeapListLock
SIZE_T RtlpDphMemoryUsedByDelayedFreeBlocks
PDPH_HEAP_BLOCK pFreeAllocationListHead
#define ROUND_UP(n, align)
SIZE_T NTAPI RtlpPageHeapSize(HANDLE HeapHandle, ULONG Flags, PVOID BaseAddress)
SLIST_HEADER RtlpDphDelayedTemporaryPushList
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
#define HEAP_NO_SERIALIZE
PHEAP_LOCK RtlpDphDelayedFreeQueueLock
NTSTATUS NTAPI RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
#define DPH_VALINFO_ALREADY_FREED
VOID NTAPI RtlpDphPlaceOnVirtualList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
VOID NTAPI RtlpDphAddNewPool(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK NodeBlock, PVOID Virtual, SIZE_T Size, BOOLEAN PlaceOnPool)
#define ZwCurrentProcess()
#define DPH_BREAK_ON_COMMIT_FAIL
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
HEAP_LOCK _RtlpDphPageHeapListLock
#define IS_BIASED_POINTER(ptr)
NTSYSAPI BOOLEAN NTAPI RtlDeleteElementGenericTableAvl(_In_ PRTL_AVL_TABLE Table, _In_ PVOID Buffer)
VOID NTAPI RtlpDphReportCorruptedBlock(_In_ PDPH_HEAP_ROOT DphRoot, _In_ ULONG Reserved, _In_ PVOID Block, _In_ ULONG ValidationInfo)
WCHAR RtlpDphTargetDlls[512]
#define DPH_VALINFO_BAD_PREFIX_PATTERN
#define APPLICATION_VERIFIER_CORRUPTED_START_STAMP
BOOLEAN NTAPI RtlpDphShouldAllocateInPageHeap(PDPH_HEAP_ROOT DphRoot, SIZE_T Size)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
BOOLEAN NTAPI RtlpPageHeapLock(HANDLE HeapPtr)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
VOID NTAPI RtlpDphPostProcessing(PDPH_HEAP_ROOT DphRoot)
BOOLEAN NTAPI RtlpPageHeapFree(HANDLE HeapPtr, ULONG Flags, PVOID Ptr)
NTSTATUS NTAPI RtlpDphProtectVm(PVOID Base, SIZE_T Size, ULONG Protection)
VOID NTAPI RtlpDphRemoveFromFreeList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node, PDPH_HEAP_BLOCK Prev)
IN PVOID IN PVOID IN USHORT IN USHORT Size
PDPH_HEAP_BLOCK pVirtualStorageListTail
BOOLEAN NTAPI RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot, ULONG Flags, PVOID BaseAddress)
#define DPH_VALINFO_BAD_END_STAMP
NTSTATUS NTAPI RtlpDphSetProtectionBeforeUse(PDPH_HEAP_ROOT DphRoot, PUCHAR VirtualBlock, ULONG UserSize)
#define POINTER_REMOVE_BIAS(ptr)
#define DPH_BREAK_ON_RELEASE_FAIL
struct _DPH_HEAP_ROOT DPH_HEAP_ROOT
#define InsertTailList(ListHead, Entry)
NTSYSAPI VOID NTAPI RtlRaiseException(_In_ PEXCEPTION_RECORD ExceptionRecord)
BOOLEAN NTAPI RtlpPageHeapGetUserInfo(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, PVOID *UserValue, PULONG UserFlags)
#define DPH_BREAK_ON_PROTECT_FAIL
LIST_ENTRY AdjacencyEntry
LIST_ENTRY RtlpDphPageHeapList
NTSTATUS NTAPI RtlpDphSetProtectionAfterUse(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
#define DPH_FILL_START_STAMP_1
struct _HEAP_LOCK * PHEAP_LOCK
ULONG RtlpPageHeapSizeRangeStart
#define DPH_FILL_END_STAMP_2
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI RtlpPageHeapUnlock(HANDLE HeapPtr)
ULONG nRemoteLockAcquired
#define POINTER_ADD_BIAS(ptr)
PDPH_HEAP_BLOCK NTAPI RtlpDphSearchAvailableMemoryListForBestFit(PDPH_HEAP_ROOT DphRoot, SIZE_T Size)
PVOID NTAPI RtlpDphAllocateNodeForTable(IN PRTL_AVL_TABLE Table, IN CLONG ByteSize)
long __cdecl _InterlockedIncrement(_Interlocked_operand_ long volatile *_Addend)
PDPH_HEAP_BLOCK pVirtualStorageListHead
VOID NTAPI RtlpDphCoalesceNodeIntoAvailable(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI RtlpDphRemoveFromBusyList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
VOID NTAPI DbgBreakPoint(VOID)
BOOLEAN NTAPI RtlpPageHeapSetUserValue(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, PVOID UserValue)
PDPH_HEAP_BLOCK NTAPI RtlpDphFindBusyMemory(PDPH_HEAP_ROOT DphRoot, PVOID pUserMem)
#define DPH_VALINFO_BAD_SUFFIX_PATTERN
BOOLEAN RtlpPageHeapEnabled
BOOLEAN NTAPI RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
NTSYSAPI PVOID NTAPI RtlInsertElementGenericTableAvl(_In_ PRTL_AVL_TABLE Table, _In_reads_bytes_(BufferSize) PVOID Buffer, _In_ CLONG BufferSize, _Out_opt_ PBOOLEAN NewElement)
#define DPH_BREAK_ON_RESERVE_FAIL
ULONG NTAPI RtlpDphGetBlockSizeFromCorruptedBlock(PVOID Block)
SIZE_T nVirtualAccessSize
#define DPH_FILL_END_STAMP_1
PDPH_HEAP_BLOCK pFreeAllocationListTail
struct _DPH_BLOCK_INFORMATION * PDPH_BLOCK_INFORMATION
NTSYSAPI PVOID NTAPI RtlDestroyHeap(IN PVOID HeapHandle)
#define APPLICATION_VERIFIER_CORRUPTED_END_STAMP
_Reserved_ PVOID Reserved
PDPH_HEAP_BLOCK NTAPI RtlpDphAllocateNode(PDPH_HEAP_ROOT DphRoot)
#define DPH_VALINFO_BAD_INFIX_PATTERN
#define APPLICATION_VERIFIER_DOUBLE_FREE
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
ULONG RtlpDphPageHeapListLength
struct _DPH_HEAP_BLOCK * pNextAlloc
VOID NTAPI RtlpDphPlaceOnPoolList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
VOID NTAPI RtlpDphFreeNodeForTable(IN PRTL_AVL_TABLE Table, IN PVOID Buffer)
NTSTATUS NTAPI RtlLeaveHeapLock(IN OUT PHEAP_LOCK Lock)
#define NtCurrentProcess()
#define RtlFillMemoryUlong(dst, len, val)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
PVOID NTAPI RtlpPageHeapReAllocate(HANDLE HeapPtr, ULONG Flags, PVOID Ptr, SIZE_T Size)
NTSYSAPI NTSTATUS NTAPI ZwQueryVirtualMemory(_In_ HANDLE ProcessHandle, _In_ PVOID Address, _In_ MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, _Out_ PVOID VirtualMemoryInformation, _In_ SIZE_T Length, _Out_opt_ PSIZE_T ResultLength)
struct _LIST_ENTRY * Flink
#define APPLICATION_VERIFIER_EXCEPTION_WHILE_VERIFYING_BLOCK_HEADER
#define APPLICATION_VERIFIER_CORRUPT_HEAP_POINTER
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
VOID NTAPI RtlpDphReturnNodeToUnusedList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
VOID NTAPI RtlpDphEnterCriticalSection(PDPH_HEAP_ROOT DphRoot, ULONG Flags)
VOID NTAPI RtlpDphPlaceOnFreeList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
RTL_BALANCED_LINKS TableLinks
_Must_inspect_result_ _In_ ULONG Flags
_Out_ PCLIENT_ID ClientId
_IRQL_requires_same_ _In_ PVOID _In_ PVOID SecondStruct
LIST_ENTRY AvailableEntry
#define NT_SUCCESS(StatCode)
_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableAvl(_In_ PRTL_AVL_TABLE Table, _In_ BOOLEAN Restart)
#define RtlFillMemory(Dest, Length, Fill)
#define EXCEPTION_EXECUTE_HANDLER
HANDLE NTAPI RtlpPageHeapCreate(ULONG Flags, PVOID Addr, SIZE_T TotalSize, SIZE_T CommitSize, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T CommitSize
VOID NTAPI RtlApplicationVerifierStop(_In_ ULONG_PTR Code, _In_ PCSTR Message, _In_ PVOID Value1, _In_ PCSTR Description1, _In_ PVOID Value2, _In_ PCSTR Description2, _In_ PVOID Value3, _In_ PCSTR Description3, _In_ PVOID Value4, _In_ PCSTR Description4)
#define DPH_FILL_START_STAMP_2
NTSYSAPI BOOLEAN WINAPI RtlValidateHeap(HANDLE, ULONG, LPCVOID)
VOID NTAPI RtlpDphFreeDelayedBlocksFromHeap(PDPH_HEAP_ROOT DphRoot, PHEAP NormalHeap)
PDPH_HEAP_BLOCK pNodePoolListTail
ULONG RtlpDphNumberOfDelayedFreeBlocks
#define HEAP_SETTABLE_USER_FLAGS
#define APPLICATION_VERIFIER_CORRUPTED_INFIX_PATTERN
BOOLEAN NTAPI RtlpPageHeapSetUserFlags(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, ULONG UserFlagsReset, ULONG UserFlagsSet)
LIST_ENTRY RtlpDphDelayedFreeQueue
NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock)
PDPH_HEAP_BLOCK NodeToAllocate
#define HEAP_NO_ALIGNMENT
PRTL_TRACE_BLOCK StackTrace
#define DPH_EXTRA_CHECK_UNDERRUN
ULONG RtlpPageHeapSizeRangeEnd
SIZE_T nVirtualStorageBytes
VOID NTAPI RtlpDphInternalValidatePageHeap(PDPH_HEAP_ROOT DphRoot, PVOID Address, ULONG Value)
NTSTATUS NTAPI RtlpDphAllocateVm(PVOID *Base, SIZE_T Size, ULONG Type, ULONG Protection)
BOOLEAN NTAPI RtlpDphWritePageHeapBlockInformation(PDPH_HEAP_ROOT DphRoot, PVOID UserAllocation, SIZE_T Size, SIZE_T UserSize)
VOID NTAPI RtlpDphPlaceOnBusyList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK DphNode)
_IRQL_requires_same_ _In_ PVOID FirstStruct
VOID NTAPI RtlInitializeGenericTableAvl(IN OUT PRTL_AVL_TABLE Table, IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, IN PRTL_AVL_FREE_ROUTINE FreeRoutine, IN PVOID TableContext)
NTSYSAPI PVOID NTAPI RtlCreateHeap(IN ULONG Flags, IN PVOID HeapBase OPTIONAL, IN ULONG ReserveSize OPTIONAL, IN ULONG CommitSize OPTIONAL, IN PVOID Lock OPTIONAL, IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL)
_Must_inspect_result_ _In_ USHORT NewSize
SIZE_T nBusyAllocationBytesAccessible
SIZE_T nUserRequestedSize
#define STATUS_INVALID_PAGE_PROTECTION
ULONG RtlpPageHeapDllRangeEnd
#define HEAP_FLAG_PAGE_ALLOCS
#define DPH_VALINFO_BAD_POINTER
#define DPH_DEBUG_INTERNAL_VALIDATE
#define DPH_BREAK_ON_NULL_FREE
#define DPH_VALINFO_CORRUPTED_AFTER_FREE
struct _EXCEPTION_RECORD * ExceptionRecord
PVOID NTAPI RtlpPageHeapAllocate(IN PVOID HeapPtr, IN ULONG Flags, IN SIZE_T Size)
PVOID NTAPI RtlpDphHeapFromPointer(PDPH_HEAP_ROOT DphHeap)
NTSYSAPI VOID NTAPI RtlInitializeSListHead(_Out_ PSLIST_HEADER ListHead)
VOID NTAPI RtlpDphLeaveCriticalSection(PDPH_HEAP_ROOT DphRoot)
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
UNICODE_STRING RtlpDphTargetDllsUnicode
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
PDPH_HEAP_BLOCK NTAPI RtlpDphFindAvailableMemory(PDPH_HEAP_ROOT DphRoot, SIZE_T Size, BOOLEAN Grow)
PVOID NTAPI RtlpDphPointerFromHandle(PVOID Handle)
VOID NTAPI RtlpDphPreProcessing(PDPH_HEAP_ROOT DphRoot, ULONG Flags)
VOID NTAPI RtlpDphRaiseException(NTSTATUS Status)
#define InitializeListHead(ListHead)
struct _DPH_BLOCK_INFORMATION DPH_BLOCK_INFORMATION
PDPH_HEAP_BLOCK pUnusedNodeListHead
struct _DPH_HEAP_BLOCK * PDPH_HEAP_BLOCK
HEAP_LOCK _RtlpDphDelayedFreeQueueLock
SIZE_T nFreeAllocationBytesCommitted
enum _RTL_GENERIC_COMPARE_RESULTS RTL_GENERIC_COMPARE_RESULTS
PDPH_HEAP_BLOCK NTAPI RtlpDphTakeNodeFromUnusedList(PDPH_HEAP_ROOT DphRoot)
PRTL_TRACE_BLOCK CreateStackTrace
PVOID NTAPI RtlpPageHeapDestroy(HANDLE HeapPtr)
NTSTATUS NTAPI RtlpSecMemFreeVirtualMemory(HANDLE Process, PVOID *Base, PSIZE_T Size, ULONG Type)
NTSTATUS NTAPI RtlpDphFreeVm(PVOID Base, SIZE_T Size, ULONG Type)
ULONG RtlpDphBreakOptions
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
BOOLEAN NTAPI RtlFlushSecureMemoryCache(IN PVOID MemoryCache, IN OPTIONAL SIZE_T MemoryLength)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
BOOLEAN NTAPI RtlpDphIsPageHeapBlock(PDPH_HEAP_ROOT DphRoot, PVOID Block, PULONG ValidationInformation, BOOLEAN CheckFillers)
ULONG nAvailableAllocations
BOOLEAN RtlpDphPageHeapListInitialized
VOID NTAPI RtlpDphRemoveFromAvailableList(PDPH_HEAP_ROOT DphRoot, PDPH_HEAP_BLOCK Node)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupElementGenericTableAvl(_In_ PRTL_AVL_TABLE Table, _In_ PVOID Buffer)
#define RtlZeroMemory(Destination, Length)
SIZE_T nBusyAllocationBytesCommitted
NTSTATUS NTAPI RtlDeleteHeapLock(IN OUT PHEAP_LOCK Lock)
#define RtlCopyMemory(Destination, Source, Length)
NTSTATUS NTAPI RtlpDphTargetDllsLogicInitialize(VOID)
ULONG nVirtualStorageRanges
ULONG RtlpDphDebugOptions
VOID NTAPI RtlpDphCoalesceFreeIntoAvailable(PDPH_HEAP_ROOT DphRoot, ULONG LeaveOnFreeList)
PDPH_HEAP_BLOCK pUnusedNodeListTail
RTL_AVL_TABLE BusyNodesTable
#define _SEH2_EXCEPT(...)
#define DPH_FREE_LIST_MINIMUM
ULONG RtlpPageHeapDllRangeStart
#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_AFTER_FREE
BOOLEAN NTAPI RtlpDebugPageHeapValidate(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress)
RTL_GENERIC_COMPARE_RESULTS NTAPI RtlpDphCompareNodeForTable(IN PRTL_AVL_TABLE Table, IN PVOID FirstStruct, IN PVOID SecondStruct)
_IRQL_requires_same_ _In_ CLONG ByteSize
#define APPLICATION_VERIFIER_CORRUPTED_PREFIX_PATTERN
#define HEAP_GENERATE_EXCEPTIONS
NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory(_In_ HANDLE ProcessHandle, _In_ PVOID *BaseAddress, _In_ SIZE_T *NumberOfBytesToProtect, _In_ ULONG NewAccessProtection, _Out_ PULONG OldAccessProtection)
BOOLEAN NTAPI RtlpDphGrowVirtual(PDPH_HEAP_ROOT DphRoot, SIZE_T Size)
#define HEAP_REALLOC_IN_PLACE_ONLY
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
NTSTATUS NTAPI RtlpDphInitializeDelayedFreeQueue(VOID)
VOID NTAPI RtlpDphVerifyIntegrity(PDPH_HEAP_ROOT DphRoot)
SIZE_T nAvailableAllocationBytesCommitted
PDPH_HEAP_BLOCK pNodePoolListHead
#define DPH_VALINFO_BAD_START_STAMP