133 #define DPH_RESERVE_SIZE 0x100000 134 #define DPH_POOL_SIZE 0x4000 135 #define DPH_FREE_LIST_MINIMUM 8 138 #define DPH_BREAK_ON_RESERVE_FAIL 0x01 139 #define DPH_BREAK_ON_COMMIT_FAIL 0x02 140 #define DPH_BREAK_ON_RELEASE_FAIL 0x04 141 #define DPH_BREAK_ON_FREE_FAIL 0x08 142 #define DPH_BREAK_ON_PROTECT_FAIL 0x10 143 #define DPH_BREAK_ON_NULL_FREE 0x80 146 #define DPH_DEBUG_INTERNAL_VALIDATE 0x01 147 #define DPH_DEBUG_VERBOSE 0x04 150 #define DPH_EXTRA_LOG_STACK_TRACES 0x02 151 #define DPH_EXTRA_CHECK_UNDERRUN 0x10 154 #define DPH_FILL 0xEEEEEEEE 155 #define DPH_FILL_START_STAMP_1 0xABCDBBBB 156 #define DPH_FILL_START_STAMP_2 0xABCDBBBA 157 #define DPH_FILL_END_STAMP_1 0xDCBABBBB 158 #define DPH_FILL_END_STAMP_2 0xDCBABBBA 159 #define DPH_FILL_SUFFIX 0xD0 160 #define DPH_FILL_INFIX 0xC0 163 #define DPH_VALINFO_BAD_START_STAMP 0x01 164 #define DPH_VALINFO_BAD_END_STAMP 0x02 165 #define DPH_VALINFO_BAD_POINTER 0x04 166 #define DPH_VALINFO_BAD_PREFIX_PATTERN 0x08 167 #define DPH_VALINFO_BAD_SUFFIX_PATTERN 0x10 168 #define DPH_VALINFO_EXCEPTION 0x20 169 #define DPH_VALINFO_1 0x40 170 #define DPH_VALINFO_BAD_INFIX_PATTERN 0x80 171 #define DPH_VALINFO_ALREADY_FREED 0x100 172 #define DPH_VALINFO_CORRUPTED_AFTER_FREE 0x200 175 #define DPH_SIGNATURE 0xFFEEDDCC 178 #define IS_BIASED_POINTER(ptr) ((ULONG_PTR)(ptr) & 1) 179 #define POINTER_REMOVE_BIAS(ptr) ((ULONG_PTR)(ptr) & ~(ULONG_PTR)1) 180 #define POINTER_ADD_BIAS(ptr) ((ULONG_PTR)(ptr) | 1) 229 DPRINT1(
"heap handle with incorrect signature\n");
244 DPRINT1(
"multithreaded access in HEAP_NO_SERIALIZE heap\n");
281 if (!DphRoot)
return;
424 BlockInfo->
Heap = DphRoot;
444 PVOID AddressUserData;
446 DPRINT(
"RtlpDphPlaceOnBusyList(%p %p)\n", DphRoot, DphNode);
467 DPRINT(
"RtlpDphPlaceOnFreeList(%p %p)\n", DphRoot,
Node);
487 DPRINT(
"RtlpDphPlaceOnPoolList(%p %p)\n", DphRoot,
Node);
507 DPRINT(
"RtlpDphPlaceOnVirtualList(%p %p)\n", DphRoot,
Node);
526 DPRINT(
"RtlpDphTakeNodeFromUnusedList(%p), ret %p\n", DphRoot,
Node);
532 Next =
Node->pNextAlloc;
546 DPRINT(
"RtlpDphReturnNodeToUnusedList(%p, %p)\n", DphRoot,
Node);
566 DPRINT(
"RtlpDphRemoveFromAvailableList(%p %p)\n", DphRoot,
Node);
582 if (NodeEntry ==
Node)
588 CurEntry = CurEntry->
Flink;
593 DPRINT1(
"Trying to remove non-existing in availlist node!\n");
617 DPRINT(
"RtlpDphRemoveFromBusyList(%p %p)\n", DphRoot,
Node);
636 DPRINT(
"RtlpDphRemoveFromFreeList(%p %p %p)\n", DphRoot,
Node, Prev);
639 Next =
Node->pNextAlloc;
661 DPRINT(
"RtlpDphCoalesceNodeIntoAvailable(%p %p)\n", DphRoot,
Node);
671 CurEntry = AvailListHead->
Flink;
673 while (CurEntry != AvailListHead)
678 PrevNode = NodeEntry;
681 CurEntry = CurEntry->
Flink;
703 sizeof(MemoryBasicInfo),
731 if (
Node->AvailableEntry.Flink != AvailListHead)
735 if (
Node->pVirtualBlock +
Node->nVirtualBlockSize == NextNode->pVirtualBlock)
743 NextNode->pVirtualBlock,
746 sizeof(MemoryBasicInfo),
755 Node->nVirtualBlockSize += NextNode->nVirtualBlockSize;
769 ULONG LeaveOnFreeList)
775 ASSERT(FreeAllocations >= LeaveOnFreeList);
777 DPRINT(
"RtlpDphCoalesceFreeIntoAvailable(%p %lu)\n", DphRoot, LeaveOnFreeList);
782 if (FreeAllocations < LeaveOnFreeList)
break;
785 Next =
Node->pNextAlloc;
806 DphStartNode = Virtual;
809 for (DphNode = Virtual,
i=NodeCount-1;
i > 0;
i--)
860 if (
Node->nVirtualBlockSize >=
Size)
867 CurEntry = CurEntry->
Flink;
1020 SizeVirtual =
Node->nVirtualBlockSize;
1032 SizeVirtual = 0x10000;
1063 if (
Node->nVirtualBlockSize >
Size)
1081 Node->nVirtualBlockSize = SizeVirtual;
1086 Node->nVirtualBlockSize = SizeVirtual -
Size;
1143 Node->nVirtualBlockSize = VirtualSize;
1166 if (FirstBlock < SecondBlock)
1168 else if (FirstBlock > SecondBlock)
1212 DPRINT1(
"Failure initializing delayed free queue critical section\n");
1233 ULONG ValidationInfo;
1246 Next = Current->
Flink;
1251 if (BlockInfo->
Heap == DphRoot)
1303 ULONG ValidationInfo)
1309 DPRINT1(
"block corrupted after having been freed\n");
1314 DPRINT1(
"block already freed\n");
1319 DPRINT1(
"corrupted infix pattern for freed block\n");
1324 DPRINT1(
"corrupted heap pointer or using wrong heap\n");
1329 DPRINT1(
"corrupted suffix pattern\n");
1334 DPRINT1(
"corrupted prefix pattern\n");
1339 DPRINT1(
"corrupted start stamp\n");
1344 DPRINT1(
"corrupted end stamp\n");
1349 DPRINT1(
"exception raised while verifying block\n");
1352 DPRINT1(
"Corrupted heap block %p\n", Block);
1358 PULONG ValidationInformation,
1366 *ValidationInformation = 0;
1375 SomethingWrong =
TRUE;
1381 *ValidationInformation = 0x101;
1388 SomethingWrong =
TRUE;
1392 if (BlockInfo->
Heap != DphRoot)
1395 SomethingWrong =
TRUE;
1409 SomethingWrong =
TRUE;
1415 return (SomethingWrong ==
FALSE);
1420 PULONG ValidationInformation,
1426 *ValidationInformation = 0;
1456 DPRINT1(
"Page heap: pid 0x%p: page heap enabled with flags 0x%X.\n",
1600 DPRINT1(
"Page heap: process 0x%p created heap @ %p (%p, flags 0x%X)\n",
1622 if (HeapPtr == RtlGetProcessHeap())
1630 if (!DphRoot)
return NULL;
1679 Next =
Node->pNextAlloc;
1690 DPRINT1(
"Page heap: process 0x%p destroyed heap @ %p (%p)\n",
1704 ULONG AllocateSize, AccessSize;
1710 if (
Size > 0x7FF00000)
1712 DPRINT1(
"extreme size request\n");
1729 if (!DphRoot)
return NULL;
1763 DPRINT1(
"Page heap: Unable to allocate virtual memory\n");
1803 BusyNode = AvailableNode;
1808 UserActualSize =
Size;
1868 ULONG ValidationInfo;
1876 DPRINT1(
"Page heap: freeing a null pointer\n");
1884 if (!DphRoot)
return FALSE;
1915 if (
Node->nVirtualAccessSize != 0)
1928 if (
Node->nVirtualAccessSize != 0)
1962 ULONG ValidationInfo;
1967 if (
Size > 0x7FF00000)
1969 DPRINT1(
"extreme size request\n");
1986 if (!DphRoot)
return NULL;
2020 OldBlockPageHeap =
FALSE;
2039 UseNormalHeap =
TRUE;
2068 if (AllocatedNode->nUserRequestedSize >
Size)
2071 DataSize = AllocatedNode->nUserRequestedSize;
2083 Node->UserValue = AllocatedNode->UserValue;
2087 Node->UserFlags = AllocatedNode->UserFlags;
2090 if (!OldBlockPageHeap)
2097 if (AllocatedNode->nVirtualAccessSize != 0)
2106 AllocatedNode->StackTrace =
NULL;
2117 DPRINT(
"Allocated new user block pointer: %p\n", NewAlloc);
2135 if (!DphRoot)
return FALSE;
2155 if (UserValue) *UserValue =
Node->UserValue;
2156 if (UserFlags) *UserFlags =
Node->UserFlags;
2176 if (!DphRoot)
return FALSE;
2196 Node->UserValue = UserValue;
2210 ULONG UserFlagsReset,
2218 if (!DphRoot)
return FALSE;
2238 Node->UserFlags &= ~(UserFlagsReset);
2239 Node->UserFlags |= UserFlagsSet;
2259 if (!DphRoot)
return -1;
2300 if (!DphRoot)
return -1;
2360 if (!DphRoot)
return FALSE;
2374 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)
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)
WCHAR RtlpDphTargetDlls[512]
#define DPH_VALINFO_BAD_PREFIX_PATTERN
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
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)
_Reserved_ PVOID Reserved
PDPH_HEAP_BLOCK NTAPI RtlpDphAllocateNode(PDPH_HEAP_ROOT DphRoot)
#define DPH_VALINFO_BAD_INFIX_PATTERN
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
_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)
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
#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
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
VOID NTAPI RtlpDphReportCorruptedBlock(PDPH_HEAP_ROOT DphRoot, ULONG Reserved, PVOID Block, ULONG ValidationInfo)
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)
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 DPH_FREE_LIST_MINIMUM
ULONG RtlpPageHeapDllRangeStart
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 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