ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

heap.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.