Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenheap.h
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS System Libraries 00004 * FILE: lib/rtl/heap.h 00005 * PURPOSE: Run-Time Libary Heap Manager header 00006 * PROGRAMMER: Aleksey Bragin 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #ifndef RTL_HEAP_H 00012 #define RTL_HEAP_H 00013 00014 /* Core heap definitions */ 00015 #define HEAP_FREELISTS 128 00016 #define HEAP_SEGMENTS 64 00017 00018 #define HEAP_ENTRY_SIZE ((ULONG)sizeof(HEAP_ENTRY)) 00019 #ifdef _WIN64 00020 #define HEAP_ENTRY_SHIFT 4 00021 #else 00022 #define HEAP_ENTRY_SHIFT 3 00023 #endif 00024 #define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT) 00025 00026 #define ARENA_INUSE_FILLER 0xBAADF00D 00027 #define ARENA_FREE_FILLER 0xFEEEFEEE 00028 #define HEAP_TAIL_FILL 0xab 00029 00030 // from ntifs.h, should go to another header! 00031 #define HEAP_GLOBAL_TAG 0x0800 00032 #define HEAP_PSEUDO_TAG_FLAG 0x8000 00033 #define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT) 00034 #define HEAP_TAGS_MASK (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT)) 00035 00036 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \ 00037 HEAP_SETTABLE_USER_VALUE | \ 00038 HEAP_TAGS_MASK) 00039 00040 /* Heap entry flags */ 00041 #define HEAP_ENTRY_BUSY 0x01 00042 #define HEAP_ENTRY_EXTRA_PRESENT 0x02 00043 #define HEAP_ENTRY_FILL_PATTERN 0x04 00044 #define HEAP_ENTRY_VIRTUAL_ALLOC 0x08 00045 #define HEAP_ENTRY_LAST_ENTRY 0x10 00046 #define HEAP_ENTRY_SETTABLE_FLAG1 0x20 00047 #define HEAP_ENTRY_SETTABLE_FLAG2 0x40 00048 #define HEAP_ENTRY_SETTABLE_FLAG3 0x80 00049 #define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3) 00050 00051 /* Signatures */ 00052 #define HEAP_SIGNATURE 0xeefeeff 00053 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee 00054 00055 /* Segment flags */ 00056 #define HEAP_USER_ALLOCATED 0x1 00057 00058 /* A handy inline to distinguis normal heap, special "debug heap" and special "page heap" */ 00059 FORCEINLINE BOOLEAN 00060 RtlpHeapIsSpecial(ULONG Flags) 00061 { 00062 if (Flags & HEAP_SKIP_VALIDATION_CHECKS) return FALSE; 00063 00064 if (Flags & (HEAP_FLAG_PAGE_ALLOCS | 00065 HEAP_VALIDATE_ALL_ENABLED | 00066 HEAP_VALIDATE_PARAMETERS_ENABLED | 00067 HEAP_CAPTURE_STACK_BACKTRACES | 00068 HEAP_CREATE_ENABLE_TRACING)) 00069 { 00070 /* This is a special heap */ 00071 return TRUE; 00072 } 00073 00074 /* No need for a special treatment */ 00075 return FALSE; 00076 } 00077 00078 /* Heap structures */ 00079 struct _HEAP_COMMON_ENTRY 00080 { 00081 #ifdef _M_AMD64 00082 PVOID PreviousBlockPrivateData; 00083 #endif 00084 union 00085 { 00086 struct 00087 { 00088 USHORT Size; 00089 UCHAR Flags; 00090 UCHAR SmallTagIndex; 00091 }; 00092 struct 00093 { 00094 #ifndef _M_AMD64 00095 PVOID SubSegmentCode; 00096 #else 00097 ULONG SubSegmentCodeDummy; 00098 #endif 00099 USHORT PreviousSize; 00100 union 00101 { 00102 UCHAR SegmentOffset; 00103 UCHAR LFHFlags; 00104 }; 00105 UCHAR UnusedBytes; 00106 }; 00107 struct 00108 { 00109 USHORT FunctionIndex; 00110 USHORT ContextValue; 00111 }; 00112 struct 00113 { 00114 ULONG InterceptorValue; 00115 USHORT UnusedBytesLength; 00116 UCHAR EntryOffset; 00117 UCHAR ExtendedBlockSignature; 00118 }; 00119 struct 00120 { 00121 ULONG Code1; 00122 USHORT Code2; 00123 UCHAR Code3; 00124 UCHAR Code4; 00125 }; 00126 ULONGLONG AgregateCode; 00127 }; 00128 }; 00129 00130 typedef struct _HEAP_FREE_ENTRY 00131 { 00132 struct _HEAP_COMMON_ENTRY; 00133 LIST_ENTRY FreeList; 00134 } HEAP_FREE_ENTRY, *PHEAP_FREE_ENTRY; 00135 00136 typedef struct _HEAP_ENTRY 00137 { 00138 struct _HEAP_COMMON_ENTRY; 00139 } HEAP_ENTRY, *PHEAP_ENTRY; 00140 00141 #ifdef _WIN64 00142 C_ASSERT(sizeof(HEAP_ENTRY) == 16); 00143 #else 00144 C_ASSERT(sizeof(HEAP_ENTRY) == 8); 00145 #endif 00146 C_ASSERT((1 << HEAP_ENTRY_SHIFT) == sizeof(HEAP_ENTRY)); 00147 00148 typedef struct _HEAP_TAG_ENTRY 00149 { 00150 ULONG Allocs; 00151 ULONG Frees; 00152 ULONG Size; 00153 USHORT TagIndex; 00154 USHORT CreatorBackTraceIndex; 00155 WCHAR TagName[24]; 00156 } HEAP_TAG_ENTRY, *PHEAP_TAG_ENTRY; 00157 00158 typedef struct _HEAP_PSEUDO_TAG_ENTRY 00159 { 00160 ULONG Allocs; 00161 ULONG Frees; 00162 SIZE_T Size; 00163 } HEAP_PSEUDO_TAG_ENTRY, *PHEAP_PSEUDO_TAG_ENTRY; 00164 00165 typedef struct _HEAP_COUNTERS 00166 { 00167 SIZE_T TotalMemoryReserved; 00168 SIZE_T TotalMemoryCommitted; 00169 SIZE_T TotalMemoryLargeUCR; 00170 SIZE_T TotalSizeInVirtualBlocks; 00171 ULONG TotalSegments; 00172 ULONG TotalUCRs; 00173 ULONG CommittOps; 00174 ULONG DeCommitOps; 00175 ULONG LockAcquires; 00176 ULONG LockCollisions; 00177 ULONG CommitRate; 00178 ULONG DecommittRate; 00179 ULONG CommitFailures; 00180 ULONG InBlockCommitFailures; 00181 ULONG CompactHeapCalls; 00182 ULONG CompactedUCRs; 00183 ULONG InBlockDeccommits; 00184 SIZE_T InBlockDeccomitSize; 00185 } HEAP_COUNTERS, *PHEAP_COUNTERS; 00186 00187 typedef struct _HEAP_TUNING_PARAMETERS 00188 { 00189 ULONG CommittThresholdShift; 00190 SIZE_T MaxPreCommittThreshold; 00191 } HEAP_TUNING_PARAMETERS, *PHEAP_TUNING_PARAMETERS; 00192 00193 typedef struct _HEAP_LIST_LOOKUP 00194 { 00195 struct _HEAP_LIST_LOOKUP *ExtendedLookup; 00196 ULONG ArraySize; 00197 ULONG ExtraItem; 00198 ULONG ItemCount; 00199 ULONG OutOfRangeItems; 00200 ULONG BaseIndex; 00201 PLIST_ENTRY ListHead; 00202 PULONG ListsInUseUlong; 00203 PLIST_ENTRY *ListHints; 00204 } HEAP_LIST_LOOKUP, *PHEAP_LIST_LOOKUP; 00205 00206 typedef struct _HEAP 00207 { 00208 HEAP_ENTRY Entry; 00209 ULONG SegmentSignature; 00210 ULONG SegmentFlags; 00211 LIST_ENTRY SegmentListEntry; 00212 struct _HEAP *Heap; 00213 PVOID BaseAddress; 00214 ULONG NumberOfPages; 00215 PHEAP_ENTRY FirstEntry; 00216 PHEAP_ENTRY LastValidEntry; 00217 ULONG NumberOfUnCommittedPages; 00218 ULONG NumberOfUnCommittedRanges; 00219 USHORT SegmentAllocatorBackTraceIndex; 00220 USHORT Reserved; 00221 LIST_ENTRY UCRSegmentList; 00222 00223 ULONG Flags; 00224 ULONG ForceFlags; 00225 ULONG CompatibilityFlags; 00226 ULONG EncodeFlagMask; 00227 HEAP_ENTRY Encoding; 00228 ULONG_PTR PointerKey; 00229 ULONG Interceptor; 00230 ULONG VirtualMemoryThreshold; 00231 ULONG Signature; 00232 SIZE_T SegmentReserve; 00233 SIZE_T SegmentCommit; 00234 SIZE_T DeCommitFreeBlockThreshold; 00235 SIZE_T DeCommitTotalFreeThreshold; 00236 SIZE_T TotalFreeSize; 00237 SIZE_T MaximumAllocationSize; 00238 USHORT ProcessHeapsListIndex; 00239 USHORT HeaderValidateLength; 00240 PVOID HeaderValidateCopy; 00241 USHORT NextAvailableTagIndex; 00242 USHORT MaximumTagIndex; 00243 PHEAP_TAG_ENTRY TagEntries; 00244 LIST_ENTRY UCRList; 00245 LIST_ENTRY UCRSegments; // FIXME: non-Vista 00246 ULONG_PTR AlignRound; 00247 ULONG_PTR AlignMask; 00248 LIST_ENTRY VirtualAllocdBlocks; 00249 LIST_ENTRY SegmentList; 00250 struct _HEAP_SEGMENT *Segments[HEAP_SEGMENTS]; //FIXME: non-Vista 00251 USHORT AllocatorBackTraceIndex; 00252 ULONG NonDedicatedListLength; 00253 PVOID BlocksIndex; // HEAP_LIST_LOOKUP 00254 PVOID UCRIndex; 00255 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries; 00256 LIST_ENTRY FreeLists[HEAP_FREELISTS]; //FIXME: non-Vista 00257 //LIST_ENTRY FreeLists; 00258 union 00259 { 00260 ULONG FreeListsInUseUlong[HEAP_FREELISTS / (sizeof(ULONG) * 8)]; //FIXME: non-Vista 00261 UCHAR FreeListsInUseBytes[HEAP_FREELISTS / (sizeof(UCHAR) * 8)]; //FIXME: non-Vista 00262 } u; 00263 PHEAP_LOCK LockVariable; 00264 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; 00265 PVOID FrontEndHeap; 00266 USHORT FrontHeapLockCount; 00267 UCHAR FrontEndHeapType; 00268 HEAP_COUNTERS Counters; 00269 HEAP_TUNING_PARAMETERS TuningParameters; 00270 } HEAP, *PHEAP; 00271 00272 typedef struct _HEAP_SEGMENT 00273 { 00274 HEAP_ENTRY Entry; 00275 ULONG SegmentSignature; 00276 ULONG SegmentFlags; 00277 LIST_ENTRY SegmentListEntry; 00278 PHEAP Heap; 00279 PVOID BaseAddress; 00280 ULONG NumberOfPages; 00281 PHEAP_ENTRY FirstEntry; 00282 PHEAP_ENTRY LastValidEntry; 00283 ULONG NumberOfUnCommittedPages; 00284 ULONG NumberOfUnCommittedRanges; 00285 USHORT SegmentAllocatorBackTraceIndex; 00286 USHORT Reserved; 00287 LIST_ENTRY UCRSegmentList; 00288 } HEAP_SEGMENT, *PHEAP_SEGMENT; 00289 00290 typedef struct _HEAP_UCR_DESCRIPTOR 00291 { 00292 LIST_ENTRY ListEntry; 00293 LIST_ENTRY SegmentEntry; 00294 PVOID Address; 00295 SIZE_T Size; 00296 } HEAP_UCR_DESCRIPTOR, *PHEAP_UCR_DESCRIPTOR; 00297 00298 typedef struct _HEAP_UCR_SEGMENT 00299 { 00300 LIST_ENTRY ListEntry; 00301 SIZE_T ReservedSize; 00302 SIZE_T CommittedSize; 00303 } HEAP_UCR_SEGMENT, *PHEAP_UCR_SEGMENT; 00304 00305 typedef struct _HEAP_ENTRY_EXTRA 00306 { 00307 union 00308 { 00309 struct 00310 { 00311 USHORT AllocatorBackTraceIndex; 00312 USHORT TagIndex; 00313 ULONG_PTR Settable; 00314 }; 00315 UINT64 ZeroInit; 00316 }; 00317 } HEAP_ENTRY_EXTRA, *PHEAP_ENTRY_EXTRA; 00318 00319 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA, *PHEAP_FREE_ENTRY_EXTRA; 00320 00321 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY 00322 { 00323 LIST_ENTRY Entry; 00324 HEAP_ENTRY_EXTRA ExtraStuff; 00325 SIZE_T CommitSize; 00326 SIZE_T ReserveSize; 00327 HEAP_ENTRY BusyBlock; 00328 } HEAP_VIRTUAL_ALLOC_ENTRY, *PHEAP_VIRTUAL_ALLOC_ENTRY; 00329 00330 /* Global variables */ 00331 extern RTL_CRITICAL_SECTION RtlpProcessHeapsListLock; 00332 extern BOOLEAN RtlpPageHeapEnabled; 00333 00334 /* Functions declarations */ 00335 00336 /* heap.c */ 00337 PHEAP_FREE_ENTRY NTAPI 00338 RtlpCoalesceFreeBlocks (PHEAP Heap, 00339 PHEAP_FREE_ENTRY FreeEntry, 00340 PSIZE_T FreeSize, 00341 BOOLEAN Remove); 00342 00343 PHEAP_ENTRY_EXTRA NTAPI 00344 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry); 00345 00346 BOOLEAN NTAPI 00347 RtlpValidateHeap(PHEAP Heap, BOOLEAN ForceValidation); 00348 00349 BOOLEAN NTAPI 00350 RtlpValidateHeapEntry(PHEAP Heap, PHEAP_ENTRY HeapEntry); 00351 00352 BOOLEAN NTAPI 00353 RtlpValidateHeapHeaders(PHEAP Heap, BOOLEAN Recalculate); 00354 00355 /* heapdbg.c */ 00356 HANDLE NTAPI 00357 RtlDebugCreateHeap(ULONG Flags, 00358 PVOID Addr, 00359 SIZE_T TotalSize, 00360 SIZE_T CommitSize, 00361 PVOID Lock, 00362 PRTL_HEAP_PARAMETERS Parameters); 00363 00364 BOOLEAN NTAPI 00365 RtlDebugDestroyHeap(HANDLE HeapPtr); 00366 00367 PVOID NTAPI 00368 RtlDebugAllocateHeap(PVOID HeapPtr, 00369 ULONG Flags, 00370 SIZE_T Size); 00371 00372 PVOID NTAPI 00373 RtlDebugReAllocateHeap(HANDLE HeapPtr, 00374 ULONG Flags, 00375 PVOID Ptr, 00376 SIZE_T Size); 00377 00378 BOOLEAN NTAPI 00379 RtlDebugFreeHeap(HANDLE HeapPtr, 00380 ULONG Flags, 00381 PVOID Ptr); 00382 00383 BOOLEAN NTAPI 00384 RtlDebugGetUserInfoHeap(PVOID HeapHandle, 00385 ULONG Flags, 00386 PVOID BaseAddress, 00387 PVOID *UserValue, 00388 PULONG UserFlags); 00389 00390 BOOLEAN NTAPI 00391 RtlDebugSetUserValueHeap(PVOID HeapHandle, 00392 ULONG Flags, 00393 PVOID BaseAddress, 00394 PVOID UserValue); 00395 00396 BOOLEAN 00397 NTAPI 00398 RtlDebugSetUserFlagsHeap(PVOID HeapHandle, 00399 ULONG Flags, 00400 PVOID BaseAddress, 00401 ULONG UserFlagsReset, 00402 ULONG UserFlagsSet); 00403 00404 SIZE_T NTAPI 00405 RtlDebugSizeHeap(HANDLE HeapPtr, 00406 ULONG Flags, 00407 PVOID Ptr); 00408 00409 /* heappage.c */ 00410 00411 HANDLE NTAPI 00412 RtlpPageHeapCreate(ULONG Flags, 00413 PVOID Addr, 00414 SIZE_T TotalSize, 00415 SIZE_T CommitSize, 00416 PVOID Lock, 00417 PRTL_HEAP_PARAMETERS Parameters); 00418 00419 PVOID NTAPI 00420 RtlpPageHeapDestroy(HANDLE HeapPtr); 00421 00422 PVOID NTAPI 00423 RtlpPageHeapAllocate(IN PVOID HeapPtr, 00424 IN ULONG Flags, 00425 IN SIZE_T Size); 00426 00427 BOOLEAN NTAPI 00428 RtlpPageHeapFree(HANDLE HeapPtr, 00429 ULONG Flags, 00430 PVOID Ptr); 00431 00432 PVOID NTAPI 00433 RtlpPageHeapReAllocate(HANDLE HeapPtr, 00434 ULONG Flags, 00435 PVOID Ptr, 00436 SIZE_T Size); 00437 00438 BOOLEAN NTAPI 00439 RtlpPageHeapGetUserInfo(PVOID HeapHandle, 00440 ULONG Flags, 00441 PVOID BaseAddress, 00442 PVOID *UserValue, 00443 PULONG UserFlags); 00444 00445 BOOLEAN NTAPI 00446 RtlpPageHeapSetUserValue(PVOID HeapHandle, 00447 ULONG Flags, 00448 PVOID BaseAddress, 00449 PVOID UserValue); 00450 00451 BOOLEAN 00452 NTAPI 00453 RtlpPageHeapSetUserFlags(PVOID HeapHandle, 00454 ULONG Flags, 00455 PVOID BaseAddress, 00456 ULONG UserFlagsReset, 00457 ULONG UserFlagsSet); 00458 00459 BOOLEAN 00460 NTAPI 00461 RtlpDebugPageHeapValidate(PVOID HeapPtr, 00462 ULONG Flags, 00463 PVOID Block); 00464 00465 SIZE_T NTAPI 00466 RtlpPageHeapSize(HANDLE HeapPtr, 00467 ULONG Flags, 00468 PVOID Ptr); 00469 00470 #endif Generated on Sun May 27 2012 04:36:22 for ReactOS by
1.7.6.1
|