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)
35 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \
36 HEAP_SETTABLE_USER_VALUE | \
37 (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT)))
39 /* Heap entry flags */
40 #define HEAP_ENTRY_BUSY 0x01
41 #define HEAP_ENTRY_EXTRA_PRESENT 0x02
42 #define HEAP_ENTRY_FILL_PATTERN 0x04
43 #define HEAP_ENTRY_VIRTUAL_ALLOC 0x08
44 #define HEAP_ENTRY_LAST_ENTRY 0x10
45 #define HEAP_ENTRY_SETTABLE_FLAG1 0x20
46 #define HEAP_ENTRY_SETTABLE_FLAG2 0x40
47 #define HEAP_ENTRY_SETTABLE_FLAG3 0x80
48 #define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3)
51 #define HEAP_SIGNATURE 0xeefeeff
52 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee
55 #define HEAP_USER_ALLOCATED 0x1
57 /* A handy inline to distinguis normal heap, special "debug heap" and special "page heap" */
59 RtlpHeapIsSpecial(ULONG Flags
)
61 if (Flags
& HEAP_SKIP_VALIDATION_CHECKS
) return FALSE
;
63 if (Flags
& (HEAP_FLAG_PAGE_ALLOCS
|
64 HEAP_VALIDATE_ALL_ENABLED
|
65 HEAP_VALIDATE_PARAMETERS_ENABLED
|
66 HEAP_CAPTURE_STACK_BACKTRACES
|
67 HEAP_CREATE_ENABLE_TRACING
))
69 /* This is a special heap */
73 /* No need for a special treatment */
78 struct _HEAP_COMMON_ENTRY
101 USHORT FunctionIndex
;
106 ULONG InterceptorValue
;
107 USHORT UnusedBytesLength
;
109 UCHAR ExtendedBlockSignature
;
118 ULONGLONG AgregateCode
;
122 typedef struct _HEAP_FREE_ENTRY
124 struct _HEAP_COMMON_ENTRY
;
126 } HEAP_FREE_ENTRY
, *PHEAP_FREE_ENTRY
;
128 typedef struct _HEAP_ENTRY
130 struct _HEAP_COMMON_ENTRY
;
131 } HEAP_ENTRY
, *PHEAP_ENTRY
;
134 C_ASSERT(sizeof(HEAP_ENTRY
) == 16);
136 C_ASSERT(sizeof(HEAP_ENTRY
) == 8);
138 C_ASSERT((1 << HEAP_ENTRY_SHIFT
) == sizeof(HEAP_ENTRY
));
140 typedef struct _HEAP_TAG_ENTRY
146 USHORT CreatorBackTraceIndex
;
148 } HEAP_TAG_ENTRY
, *PHEAP_TAG_ENTRY
;
150 typedef struct _HEAP_PSEUDO_TAG_ENTRY
155 } HEAP_PSEUDO_TAG_ENTRY
, *PHEAP_PSEUDO_TAG_ENTRY
;
157 typedef struct _HEAP_COUNTERS
159 ULONG TotalMemoryReserved
;
160 ULONG TotalMemoryCommitted
;
161 ULONG TotalMemoryLargeUCR
;
162 ULONG TotalSizeInVirtualBlocks
;
168 ULONG LockCollisions
;
171 ULONG CommitFailures
;
172 ULONG InBlockCommitFailures
;
173 ULONG CompactHeapCalls
;
175 ULONG InBlockDeccommits
;
176 ULONG InBlockDeccomitSize
;
177 } HEAP_COUNTERS
, *PHEAP_COUNTERS
;
179 typedef struct _HEAP_TUNING_PARAMETERS
181 ULONG CommittThresholdShift
;
182 ULONG MaxPreCommittThreshold
;
183 } HEAP_TUNING_PARAMETERS
, *PHEAP_TUNING_PARAMETERS
;
188 ULONG SegmentSignature
;
190 LIST_ENTRY SegmentListEntry
;
194 PHEAP_ENTRY FirstEntry
;
195 PHEAP_ENTRY LastValidEntry
;
196 ULONG NumberOfUnCommittedPages
;
197 ULONG NumberOfUnCommittedRanges
;
198 USHORT SegmentAllocatorBackTraceIndex
;
200 LIST_ENTRY UCRSegmentList
;
204 ULONG CompatibilityFlags
;
205 ULONG EncodeFlagMask
;
209 ULONG VirtualMemoryThreshold
;
211 ULONG SegmentReserve
;
213 ULONG DeCommitFreeBlockThreshold
;
214 ULONG DeCommitTotalFreeThreshold
;
216 ULONG MaximumAllocationSize
;
217 USHORT ProcessHeapsListIndex
;
218 USHORT HeaderValidateLength
;
219 PVOID HeaderValidateCopy
;
220 USHORT NextAvailableTagIndex
;
221 USHORT MaximumTagIndex
;
222 PHEAP_TAG_ENTRY TagEntries
;
224 LIST_ENTRY UCRSegments
; // FIXME: non-Vista
227 LIST_ENTRY VirtualAllocdBlocks
;
228 LIST_ENTRY SegmentList
;
229 struct _HEAP_SEGMENT
*Segments
[HEAP_SEGMENTS
]; //FIXME: non-Vista
230 USHORT AllocatorBackTraceIndex
;
231 ULONG NonDedicatedListLength
;
234 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
;
235 LIST_ENTRY FreeLists
[HEAP_FREELISTS
]; //FIXME: non-Vista
238 ULONG FreeListsInUseUlong
[HEAP_FREELISTS
/ (sizeof(ULONG
) * 8)]; //FIXME: non-Vista
239 UCHAR FreeListsInUseBytes
[HEAP_FREELISTS
/ (sizeof(UCHAR
) * 8)]; //FIXME: non-Vista
241 PHEAP_LOCK LockVariable
;
242 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
244 USHORT FrontHeapLockCount
;
245 UCHAR FrontEndHeapType
;
246 HEAP_COUNTERS Counters
;
247 HEAP_TUNING_PARAMETERS TuningParameters
;
250 typedef struct _HEAP_SEGMENT
253 ULONG SegmentSignature
;
255 LIST_ENTRY SegmentListEntry
;
259 PHEAP_ENTRY FirstEntry
;
260 PHEAP_ENTRY LastValidEntry
;
261 ULONG NumberOfUnCommittedPages
;
262 ULONG NumberOfUnCommittedRanges
;
263 USHORT SegmentAllocatorBackTraceIndex
;
265 LIST_ENTRY UCRSegmentList
;
266 PHEAP_ENTRY LastEntryInSegment
; //FIXME: non-Vista
267 } HEAP_SEGMENT
, *PHEAP_SEGMENT
;
269 typedef struct _HEAP_UCR_DESCRIPTOR
271 LIST_ENTRY ListEntry
;
272 LIST_ENTRY SegmentEntry
;
275 } HEAP_UCR_DESCRIPTOR
, *PHEAP_UCR_DESCRIPTOR
;
277 typedef struct _HEAP_UCR_SEGMENT
279 LIST_ENTRY ListEntry
;
281 SIZE_T CommittedSize
;
282 } HEAP_UCR_SEGMENT
, *PHEAP_UCR_SEGMENT
;
284 typedef struct _HEAP_ENTRY_EXTRA
290 USHORT AllocatorBackTraceIndex
;
296 } HEAP_ENTRY_EXTRA
, *PHEAP_ENTRY_EXTRA
;
298 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
, *PHEAP_FREE_ENTRY_EXTRA
;
300 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
303 HEAP_ENTRY_EXTRA ExtraStuff
;
306 HEAP_ENTRY BusyBlock
;
307 } HEAP_VIRTUAL_ALLOC_ENTRY
, *PHEAP_VIRTUAL_ALLOC_ENTRY
;
309 /* Global variables */
310 extern HEAP_LOCK RtlpProcessHeapsListLock
;
311 extern BOOLEAN RtlpPageHeapEnabled
;
313 /* Functions declarations */
316 PHEAP_FREE_ENTRY NTAPI
317 RtlpCoalesceFreeBlocks (PHEAP Heap
,
318 PHEAP_FREE_ENTRY FreeEntry
,
322 PHEAP_ENTRY_EXTRA NTAPI
323 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry
);
326 RtlpValidateHeap(PHEAP Heap
, BOOLEAN ForceValidation
);
329 RtlpValidateHeapEntry(PHEAP Heap
, PHEAP_ENTRY HeapEntry
);
332 RtlpValidateHeapHeaders(PHEAP Heap
, BOOLEAN Recalculate
);
336 RtlDebugCreateHeap(ULONG Flags
,
341 PRTL_HEAP_PARAMETERS Parameters
);
344 RtlDebugDestroyHeap(HANDLE HeapPtr
);
347 RtlDebugAllocateHeap(PVOID HeapPtr
,
352 RtlDebugReAllocateHeap(HANDLE HeapPtr
,
358 RtlDebugFreeHeap(HANDLE HeapPtr
,
363 RtlDebugGetUserInfoHeap(PVOID HeapHandle
,
370 RtlDebugSetUserValueHeap(PVOID HeapHandle
,
377 RtlDebugSetUserFlagsHeap(PVOID HeapHandle
,
380 ULONG UserFlagsReset
,
384 RtlDebugSizeHeap(HANDLE HeapPtr
,
391 RtlpPageHeapCreate(ULONG Flags
,
396 PRTL_HEAP_PARAMETERS Parameters
);
399 RtlpPageHeapDestroy(HANDLE HeapPtr
);
402 RtlpPageHeapAllocate(IN PVOID HeapPtr
,
407 RtlpPageHeapFree(HANDLE HeapPtr
,
412 RtlpPageHeapReAllocate(HANDLE HeapPtr
,
418 RtlpPageHeapGetUserInfo(PVOID HeapHandle
,
425 RtlpPageHeapSetUserValue(PVOID HeapHandle
,
432 RtlpPageHeapSetUserFlags(PVOID HeapHandle
,
435 ULONG UserFlagsReset
,
440 RtlpDebugPageHeapValidate(PVOID HeapPtr
,
445 RtlpPageHeapSize(HANDLE HeapPtr
,