2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
5 * PURPOSE: Run-Time Libary Heap Manager header
6 * PROGRAMMER: Aleksey Bragin
9 /* INCLUDES ******************************************************************/
14 /* Core heap definitions */
15 #define HEAP_FREELISTS 128
16 #define HEAP_SEGMENTS 64
18 #define HEAP_ENTRY_SIZE ((ULONG)sizeof(HEAP_ENTRY))
20 #define HEAP_ENTRY_SHIFT 4
22 #define HEAP_ENTRY_SHIFT 3
24 #define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT)
26 #define ARENA_INUSE_FILLER 0xBAADF00D
27 #define ARENA_FREE_FILLER 0xFEEEFEEE
28 #define HEAP_TAIL_FILL 0xab
30 // from ntifs.h, should go to another header!
31 #define HEAP_GLOBAL_TAG 0x0800
32 #define HEAP_PSEUDO_TAG_FLAG 0x8000
33 #define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
34 #define HEAP_TAGS_MASK (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT))
36 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \
37 HEAP_SETTABLE_USER_VALUE | \
40 /* Heap entry flags */
41 #define HEAP_ENTRY_BUSY 0x01
42 #define HEAP_ENTRY_EXTRA_PRESENT 0x02
43 #define HEAP_ENTRY_FILL_PATTERN 0x04
44 #define HEAP_ENTRY_VIRTUAL_ALLOC 0x08
45 #define HEAP_ENTRY_LAST_ENTRY 0x10
46 #define HEAP_ENTRY_SETTABLE_FLAG1 0x20
47 #define HEAP_ENTRY_SETTABLE_FLAG2 0x40
48 #define HEAP_ENTRY_SETTABLE_FLAG3 0x80
49 #define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3)
52 #define HEAP_SIGNATURE 0xeefeeff
53 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee
56 #define HEAP_USER_ALLOCATED 0x1
58 /* A handy inline to distinguis normal heap, special "debug heap" and special "page heap" */
60 RtlpHeapIsSpecial(ULONG Flags
)
62 if (Flags
& HEAP_SKIP_VALIDATION_CHECKS
) return FALSE
;
64 if (Flags
& (HEAP_FLAG_PAGE_ALLOCS
|
65 HEAP_VALIDATE_ALL_ENABLED
|
66 HEAP_VALIDATE_PARAMETERS_ENABLED
|
67 HEAP_CAPTURE_STACK_BACKTRACES
|
68 HEAP_CREATE_ENABLE_TRACING
))
70 /* This is a special heap */
74 /* No need for a special treatment */
79 struct _HEAP_COMMON_ENTRY
82 PVOID PreviousBlockPrivateData
;
97 ULONG SubSegmentCodeDummy
;
109 USHORT FunctionIndex
;
114 ULONG InterceptorValue
;
115 USHORT UnusedBytesLength
;
117 UCHAR ExtendedBlockSignature
;
126 ULONGLONG AgregateCode
;
130 typedef struct _HEAP_FREE_ENTRY
132 struct _HEAP_COMMON_ENTRY
;
134 } HEAP_FREE_ENTRY
, *PHEAP_FREE_ENTRY
;
136 typedef struct _HEAP_ENTRY
138 struct _HEAP_COMMON_ENTRY
;
139 } HEAP_ENTRY
, *PHEAP_ENTRY
;
142 C_ASSERT(sizeof(HEAP_ENTRY
) == 16);
144 C_ASSERT(sizeof(HEAP_ENTRY
) == 8);
146 C_ASSERT((1 << HEAP_ENTRY_SHIFT
) == sizeof(HEAP_ENTRY
));
148 typedef struct _HEAP_TAG_ENTRY
154 USHORT CreatorBackTraceIndex
;
156 } HEAP_TAG_ENTRY
, *PHEAP_TAG_ENTRY
;
158 typedef struct _HEAP_PSEUDO_TAG_ENTRY
163 } HEAP_PSEUDO_TAG_ENTRY
, *PHEAP_PSEUDO_TAG_ENTRY
;
165 typedef struct _HEAP_COUNTERS
167 SIZE_T TotalMemoryReserved
;
168 SIZE_T TotalMemoryCommitted
;
169 SIZE_T TotalMemoryLargeUCR
;
170 SIZE_T TotalSizeInVirtualBlocks
;
176 ULONG LockCollisions
;
179 ULONG CommitFailures
;
180 ULONG InBlockCommitFailures
;
181 ULONG CompactHeapCalls
;
183 ULONG InBlockDeccommits
;
184 SIZE_T InBlockDeccomitSize
;
185 } HEAP_COUNTERS
, *PHEAP_COUNTERS
;
187 typedef struct _HEAP_TUNING_PARAMETERS
189 ULONG CommittThresholdShift
;
190 SIZE_T MaxPreCommittThreshold
;
191 } HEAP_TUNING_PARAMETERS
, *PHEAP_TUNING_PARAMETERS
;
193 typedef struct _HEAP_LIST_LOOKUP
195 struct _HEAP_LIST_LOOKUP
*ExtendedLookup
;
199 ULONG OutOfRangeItems
;
201 PLIST_ENTRY ListHead
;
202 PULONG ListsInUseUlong
;
203 PLIST_ENTRY
*ListHints
;
204 } HEAP_LIST_LOOKUP
, *PHEAP_LIST_LOOKUP
;
209 ULONG SegmentSignature
;
211 LIST_ENTRY SegmentListEntry
;
215 PHEAP_ENTRY FirstEntry
;
216 PHEAP_ENTRY LastValidEntry
;
217 ULONG NumberOfUnCommittedPages
;
218 ULONG NumberOfUnCommittedRanges
;
219 USHORT SegmentAllocatorBackTraceIndex
;
221 LIST_ENTRY UCRSegmentList
;
225 ULONG CompatibilityFlags
;
226 ULONG EncodeFlagMask
;
228 ULONG_PTR PointerKey
;
230 ULONG VirtualMemoryThreshold
;
232 SIZE_T SegmentReserve
;
233 SIZE_T SegmentCommit
;
234 SIZE_T DeCommitFreeBlockThreshold
;
235 SIZE_T DeCommitTotalFreeThreshold
;
236 SIZE_T TotalFreeSize
;
237 SIZE_T MaximumAllocationSize
;
238 USHORT ProcessHeapsListIndex
;
239 USHORT HeaderValidateLength
;
240 PVOID HeaderValidateCopy
;
241 USHORT NextAvailableTagIndex
;
242 USHORT MaximumTagIndex
;
243 PHEAP_TAG_ENTRY TagEntries
;
245 LIST_ENTRY UCRSegments
; // FIXME: non-Vista
246 ULONG_PTR AlignRound
;
248 LIST_ENTRY VirtualAllocdBlocks
;
249 LIST_ENTRY SegmentList
;
250 struct _HEAP_SEGMENT
*Segments
[HEAP_SEGMENTS
]; //FIXME: non-Vista
251 USHORT AllocatorBackTraceIndex
;
252 ULONG NonDedicatedListLength
;
253 PVOID BlocksIndex
; // HEAP_LIST_LOOKUP
255 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
;
256 LIST_ENTRY FreeLists
[HEAP_FREELISTS
]; //FIXME: non-Vista
257 //LIST_ENTRY FreeLists;
260 ULONG FreeListsInUseUlong
[HEAP_FREELISTS
/ (sizeof(ULONG
) * 8)]; //FIXME: non-Vista
261 UCHAR FreeListsInUseBytes
[HEAP_FREELISTS
/ (sizeof(UCHAR
) * 8)]; //FIXME: non-Vista
263 PHEAP_LOCK LockVariable
;
264 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
266 USHORT FrontHeapLockCount
;
267 UCHAR FrontEndHeapType
;
268 HEAP_COUNTERS Counters
;
269 HEAP_TUNING_PARAMETERS TuningParameters
;
272 typedef struct _HEAP_SEGMENT
275 ULONG SegmentSignature
;
277 LIST_ENTRY SegmentListEntry
;
281 PHEAP_ENTRY FirstEntry
;
282 PHEAP_ENTRY LastValidEntry
;
283 ULONG NumberOfUnCommittedPages
;
284 ULONG NumberOfUnCommittedRanges
;
285 USHORT SegmentAllocatorBackTraceIndex
;
287 LIST_ENTRY UCRSegmentList
;
288 } HEAP_SEGMENT
, *PHEAP_SEGMENT
;
290 typedef struct _HEAP_UCR_DESCRIPTOR
292 LIST_ENTRY ListEntry
;
293 LIST_ENTRY SegmentEntry
;
296 } HEAP_UCR_DESCRIPTOR
, *PHEAP_UCR_DESCRIPTOR
;
298 typedef struct _HEAP_UCR_SEGMENT
300 LIST_ENTRY ListEntry
;
302 SIZE_T CommittedSize
;
303 } HEAP_UCR_SEGMENT
, *PHEAP_UCR_SEGMENT
;
305 typedef struct _HEAP_ENTRY_EXTRA
311 USHORT AllocatorBackTraceIndex
;
317 } HEAP_ENTRY_EXTRA
, *PHEAP_ENTRY_EXTRA
;
319 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
, *PHEAP_FREE_ENTRY_EXTRA
;
321 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
324 HEAP_ENTRY_EXTRA ExtraStuff
;
327 HEAP_ENTRY BusyBlock
;
328 } HEAP_VIRTUAL_ALLOC_ENTRY
, *PHEAP_VIRTUAL_ALLOC_ENTRY
;
330 /* Global variables */
331 extern RTL_CRITICAL_SECTION RtlpProcessHeapsListLock
;
332 extern BOOLEAN RtlpPageHeapEnabled
;
334 /* Functions declarations */
337 PHEAP_FREE_ENTRY NTAPI
338 RtlpCoalesceFreeBlocks (PHEAP Heap
,
339 PHEAP_FREE_ENTRY FreeEntry
,
343 PHEAP_ENTRY_EXTRA NTAPI
344 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry
);
347 RtlpValidateHeap(PHEAP Heap
, BOOLEAN ForceValidation
);
350 RtlpValidateHeapEntry(PHEAP Heap
, PHEAP_ENTRY HeapEntry
);
353 RtlpValidateHeapHeaders(PHEAP Heap
, BOOLEAN Recalculate
);
357 RtlDebugCreateHeap(ULONG Flags
,
362 PRTL_HEAP_PARAMETERS Parameters
);
365 RtlDebugDestroyHeap(HANDLE HeapPtr
);
368 RtlDebugAllocateHeap(PVOID HeapPtr
,
373 RtlDebugReAllocateHeap(HANDLE HeapPtr
,
379 RtlDebugFreeHeap(HANDLE HeapPtr
,
384 RtlDebugGetUserInfoHeap(PVOID HeapHandle
,
391 RtlDebugSetUserValueHeap(PVOID HeapHandle
,
398 RtlDebugSetUserFlagsHeap(PVOID HeapHandle
,
401 ULONG UserFlagsReset
,
405 RtlDebugSizeHeap(HANDLE HeapPtr
,
412 RtlpPageHeapCreate(ULONG Flags
,
417 PRTL_HEAP_PARAMETERS Parameters
);
420 RtlpPageHeapDestroy(HANDLE HeapPtr
);
423 RtlpPageHeapAllocate(IN PVOID HeapPtr
,
428 RtlpPageHeapFree(HANDLE HeapPtr
,
433 RtlpPageHeapReAllocate(HANDLE HeapPtr
,
439 RtlpPageHeapLock(HANDLE HeapPtr
);
442 RtlpPageHeapUnlock(HANDLE HeapPtr
);
445 RtlpPageHeapGetUserInfo(PVOID HeapHandle
,
452 RtlpPageHeapSetUserValue(PVOID HeapHandle
,
459 RtlpPageHeapSetUserFlags(PVOID HeapHandle
,
462 ULONG UserFlagsReset
,
467 RtlpDebugPageHeapValidate(PVOID HeapPtr
,
472 RtlpPageHeapSize(HANDLE HeapPtr
,
478 RtlpAddHeapToProcessList(PHEAP Heap
);
482 RtlpRemoveHeapFromProcessList(PHEAP Heap
);
486 RtlInitializeHeapManager(VOID
);