Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmmtypes.h
Go to the documentation of this file.
00001 /*++ NDK Version: 0098 00002 00003 Copyright (c) Alex Ionescu. All rights reserved. 00004 00005 Header Name: 00006 00007 mmtypes.h 00008 00009 Abstract: 00010 00011 Type definitions for the Memory Manager 00012 00013 Author: 00014 00015 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006 00016 00017 --*/ 00018 00019 #ifndef _MMTYPES_H 00020 #define _MMTYPES_H 00021 00022 // 00023 // Dependencies 00024 // 00025 #include <umtypes.h> 00026 #include <arch/mmtypes.h> 00027 #include <extypes.h> 00028 00029 // 00030 // Page-Rounding Macros 00031 // 00032 #define PAGE_ROUND_DOWN(x) \ 00033 (((ULONG_PTR)(x))&(~(PAGE_SIZE-1))) 00034 #define PAGE_ROUND_UP(x) \ 00035 ( (((ULONG_PTR)(x)) + PAGE_SIZE-1) & (~(PAGE_SIZE-1)) ) 00036 #ifdef NTOS_MODE_USER 00037 #define ROUND_TO_PAGES(Size) \ 00038 (((ULONG_PTR)(Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) 00039 #endif 00040 #define ROUND_TO_ALLOCATION_GRANULARITY(Size) \ 00041 (((ULONG_PTR)(Size) + MM_ALLOCATION_GRANULARITY - 1) \ 00042 & ~(MM_ALLOCATION_GRANULARITY - 1)) 00043 00044 // 00045 // PFN Identity Uses 00046 // 00047 #define MMPFNUSE_PROCESSPRIVATE 0 00048 #define MMPFNUSE_FILE 1 00049 #define MMPFNUSE_PAGEFILEMAPPED 2 00050 #define MMPFNUSE_PAGETABLE 3 00051 #define MMPFNUSE_PAGEDPOOL 4 00052 #define MMPFNUSE_NONPAGEDPOOL 5 00053 #define MMPFNUSE_SYSTEMPTE 6 00054 #define MMPFNUSE_SESSIONPRIVATE 7 00055 #define MMPFNUSE_METAFILE 8 00056 #define MMPFNUSE_AWEPAGE 9 00057 #define MMPFNUSE_DRIVERLOCKPAGE 10 00058 #define MMPFNUSE_KERNELSTACK 11 00059 00060 // 00061 // Lock/Unlock Virtuam Memory Flags 00062 // 00063 #define MAP_PROCESS 1 00064 #define MAP_SYSTEM 2 00065 00066 // 00067 // Flags for ProcessExecutionOptions 00068 // 00069 #define MEM_EXECUTE_OPTION_DISABLE 0x1 00070 #define MEM_EXECUTE_OPTION_ENABLE 0x2 00071 #define MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION 0x4 00072 #define MEM_EXECUTE_OPTION_PERMANENT 0x8 00073 #define MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE 0x10 00074 #define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20 00075 #define MEM_EXECUTE_OPTION_VALID_FLAGS 0x3F 00076 00077 #ifndef NTOS_MODE_USER 00078 // 00079 // Virtual Memory Flags 00080 // 00081 #define MEM_WRITE_WATCH 0x200000 00082 #define MEM_PHYSICAL 0x400000 00083 #define MEM_ROTATE 0x800000 00084 #define MEM_IMAGE SEC_IMAGE 00085 #define MEM_DOS_LIM 0x40000000 00086 00087 // 00088 // Section Flags for NtCreateSection 00089 // 00090 #define SEC_NO_CHANGE 0x400000 00091 #define SEC_FILE 0x800000 00092 #define SEC_IMAGE 0x1000000 00093 #define SEC_PROTECTED_IMAGE 0x2000000 00094 #define SEC_RESERVE 0x4000000 00095 #define SEC_COMMIT 0x8000000 00096 #define SEC_NOCACHE 0x10000000 00097 #define SEC_WRITECOMBINE 0x40000000 00098 #define SEC_LARGE_PAGES 0x80000000 00099 #else 00100 #define SEC_BASED 0x200000 00101 00102 // 00103 // Section Inherit Flags for NtCreateSection 00104 // 00105 typedef enum _SECTION_INHERIT 00106 { 00107 ViewShare = 1, 00108 ViewUnmap = 2 00109 } SECTION_INHERIT; 00110 00111 // 00112 // Pool Types 00113 // 00114 typedef enum _POOL_TYPE 00115 { 00116 NonPagedPool, 00117 PagedPool, 00118 NonPagedPoolMustSucceed, 00119 DontUseThisType, 00120 NonPagedPoolCacheAligned, 00121 PagedPoolCacheAligned, 00122 NonPagedPoolCacheAlignedMustS, 00123 MaxPoolType, 00124 NonPagedPoolSession = 32, 00125 PagedPoolSession, 00126 NonPagedPoolMustSucceedSession, 00127 DontUseThisTypeSession, 00128 NonPagedPoolCacheAlignedSession, 00129 PagedPoolCacheAlignedSession, 00130 NonPagedPoolCacheAlignedMustSSession 00131 } POOL_TYPE; 00132 #endif 00133 00134 // 00135 // Memory Manager Page Lists 00136 // 00137 typedef enum _MMLISTS 00138 { 00139 ZeroedPageList = 0, 00140 FreePageList = 1, 00141 StandbyPageList = 2, 00142 ModifiedPageList = 3, 00143 ModifiedNoWritePageList = 4, 00144 BadPageList = 5, 00145 ActiveAndValid = 6, 00146 TransitionPage = 7 00147 } MMLISTS; 00148 00149 // 00150 // Per Processor Non Paged Lookaside List IDs 00151 // 00152 typedef enum _PP_NPAGED_LOOKASIDE_NUMBER 00153 { 00154 LookasideSmallIrpList = 0, 00155 LookasideLargeIrpList = 1, 00156 LookasideMdlList = 2, 00157 LookasideCreateInfoList = 3, 00158 LookasideNameBufferList = 4, 00159 LookasideTwilightList = 5, 00160 LookasideCompletionList = 6, 00161 LookasideMaximumList = 7 00162 } PP_NPAGED_LOOKASIDE_NUMBER; 00163 00164 // 00165 // Memory Information Classes for NtQueryVirtualMemory 00166 // 00167 typedef enum _MEMORY_INFORMATION_CLASS 00168 { 00169 MemoryBasicInformation, 00170 MemoryWorkingSetList, 00171 MemorySectionName, 00172 MemoryBasicVlmInformation 00173 } MEMORY_INFORMATION_CLASS; 00174 00175 // 00176 // Section Information Clasess for NtQuerySection 00177 // 00178 typedef enum _SECTION_INFORMATION_CLASS 00179 { 00180 SectionBasicInformation, 00181 SectionImageInformation, 00182 } SECTION_INFORMATION_CLASS; 00183 00184 // 00185 // Kinds of VADs 00186 // 00187 typedef enum _MI_VAD_TYPE 00188 { 00189 VadNone, 00190 VadDevicePhysicalMemory, 00191 VadImageMap, 00192 VadAwe, 00193 VadWriteWatch, 00194 VadLargePages, 00195 VadRotatePhysical, 00196 VadLargePageSection 00197 } MI_VAD_TYPE, *PMI_VAD_TYPE; 00198 00199 #ifdef NTOS_MODE_USER 00200 00201 // 00202 // Virtual Memory Counters 00203 // 00204 typedef struct _VM_COUNTERS 00205 { 00206 SIZE_T PeakVirtualSize; 00207 SIZE_T VirtualSize; 00208 ULONG PageFaultCount; 00209 SIZE_T PeakWorkingSetSize; 00210 SIZE_T WorkingSetSize; 00211 SIZE_T QuotaPeakPagedPoolUsage; 00212 SIZE_T QuotaPagedPoolUsage; 00213 SIZE_T QuotaPeakNonPagedPoolUsage; 00214 SIZE_T QuotaNonPagedPoolUsage; 00215 SIZE_T PagefileUsage; 00216 SIZE_T PeakPagefileUsage; 00217 } VM_COUNTERS, *PVM_COUNTERS; 00218 00219 typedef struct _VM_COUNTERS_EX 00220 { 00221 SIZE_T PeakVirtualSize; 00222 SIZE_T VirtualSize; 00223 ULONG PageFaultCount; 00224 SIZE_T PeakWorkingSetSize; 00225 SIZE_T WorkingSetSize; 00226 SIZE_T QuotaPeakPagedPoolUsage; 00227 SIZE_T QuotaPagedPoolUsage; 00228 SIZE_T QuotaPeakNonPagedPoolUsage; 00229 SIZE_T QuotaNonPagedPoolUsage; 00230 SIZE_T PagefileUsage; 00231 SIZE_T PeakPagefileUsage; 00232 SIZE_T PrivateUsage; 00233 } VM_COUNTERS_EX, *PVM_COUNTERS_EX; 00234 #endif 00235 00236 // 00237 // Sub-Information Types for PFN Identity 00238 // 00239 typedef struct _MEMORY_FRAME_INFORMATION 00240 { 00241 ULONGLONG UseDescription:4; 00242 ULONGLONG ListDescription:3; 00243 ULONGLONG Reserved0:1; 00244 ULONGLONG Pinned:1; 00245 ULONGLONG DontUse:48; 00246 ULONGLONG Priority:3; 00247 ULONGLONG Reserved:4; 00248 } MEMORY_FRAME_INFORMATION, *PMEMORY_FRAME_INFORMATION; 00249 00250 typedef struct _FILEOFFSET_INFORMATION 00251 { 00252 ULONGLONG DontUse:9; 00253 ULONGLONG Offset:48; 00254 ULONGLONG Reserved:7; 00255 } FILEOFFSET_INFORMATION, *PFILEOFFSET_INFORMATION; 00256 00257 typedef struct _PAGEDIR_INFORMATION 00258 { 00259 ULONGLONG DontUse:9; 00260 ULONGLONG PageDirectoryBase:48; 00261 ULONGLONG Reserved:7; 00262 } PAGEDIR_INFORMATION, *PPAGEDIR_INFORMATION; 00263 00264 typedef struct _UNIQUE_PROCESS_INFORMATION 00265 { 00266 ULONGLONG DontUse:9; 00267 ULONGLONG UniqueProcessKey:48; 00268 ULONGLONG Reserved:7; 00269 } UNIQUE_PROCESS_INFORMATION, *PUNIQUE_PROCESS_INFORMATION; 00270 00271 // 00272 // PFN Identity Data Structure 00273 // 00274 typedef struct _MMPFN_IDENTITY 00275 { 00276 union 00277 { 00278 MEMORY_FRAME_INFORMATION e1; 00279 FILEOFFSET_INFORMATION e2; 00280 PAGEDIR_INFORMATION e3; 00281 UNIQUE_PROCESS_INFORMATION e4; 00282 } u1; 00283 SIZE_T PageFrameIndex; 00284 union 00285 { 00286 struct 00287 { 00288 ULONG Image:1; 00289 ULONG Mismatch:1; 00290 } e1; 00291 PVOID FileObject; 00292 PVOID UniqueFileObjectKey; 00293 PVOID ProtoPteAddress; 00294 PVOID VirtualAddress; 00295 } u2; 00296 } MMPFN_IDENTITY, *PMMPFN_IDENTITY; 00297 00298 // 00299 // List of Working Sets 00300 // 00301 typedef struct _MEMORY_WORKING_SET_LIST 00302 { 00303 ULONG NumberOfPages; 00304 ULONG WorkingSetList[1]; 00305 } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST; 00306 00307 // 00308 // Memory Information Structures for NtQueryVirtualMemory 00309 // 00310 typedef struct 00311 { 00312 UNICODE_STRING SectionFileName; 00313 WCHAR NameBuffer[ANYSIZE_ARRAY]; 00314 } MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME; 00315 00316 // 00317 // Section Information Structures for NtQuerySection 00318 // 00319 typedef struct _SECTION_BASIC_INFORMATION 00320 { 00321 PVOID BaseAddress; 00322 ULONG Attributes; 00323 LARGE_INTEGER Size; 00324 } SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION; 00325 00326 typedef struct _SECTION_IMAGE_INFORMATION 00327 { 00328 PVOID TransferAddress; 00329 ULONG ZeroBits; 00330 SIZE_T MaximumStackSize; 00331 SIZE_T CommittedStackSize; 00332 ULONG SubSystemType; 00333 union 00334 { 00335 struct 00336 { 00337 USHORT SubSystemMinorVersion; 00338 USHORT SubSystemMajorVersion; 00339 }; 00340 ULONG SubSystemVersion; 00341 }; 00342 ULONG GpValue; 00343 USHORT ImageCharacteristics; 00344 USHORT DllCharacteristics; 00345 USHORT Machine; 00346 UCHAR ImageContainsCode; 00347 UCHAR Spare1; 00348 ULONG LoaderFlags; 00349 ULONG ImageFileSize; 00350 ULONG Reserved[1]; 00351 } SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION; 00352 00353 #ifndef NTOS_MODE_USER 00354 00355 // 00356 // PTE Structures 00357 // 00358 typedef struct _MMPTE 00359 { 00360 union 00361 { 00362 ULONG_PTR Long; 00363 HARDWARE_PTE Flush; 00364 MMPTE_HARDWARE Hard; 00365 MMPTE_PROTOTYPE Proto; 00366 MMPTE_SOFTWARE Soft; 00367 MMPTE_TRANSITION Trans; 00368 MMPTE_SUBSECTION Subsect; 00369 MMPTE_LIST List; 00370 } u; 00371 } MMPTE, *PMMPTE; 00372 00373 // 00374 // Section Extension Information 00375 // 00376 typedef struct _MMEXTEND_INFO 00377 { 00378 ULONGLONG CommittedSize; 00379 ULONG ReferenceCount; 00380 } MMEXTEND_INFO, *PMMEXTEND_INFO; 00381 00382 // 00383 // Segment and Segment Flags 00384 // 00385 typedef struct _SEGMENT_FLAGS 00386 { 00387 ULONG TotalNumberOfPtes4132:10; 00388 ULONG ExtraSharedWowSubsections:1; 00389 ULONG LargePages:1; 00390 ULONG Spare:20; 00391 } SEGMENT_FLAGS, *PSEGMENT_FLAGS; 00392 00393 typedef struct _SEGMENT 00394 { 00395 struct _CONTROL_AREA *ControlArea; 00396 ULONG TotalNumberOfPtes; 00397 ULONG NonExtendedPtes; 00398 ULONG Spare0; 00399 ULONGLONG SizeOfSegment; 00400 MMPTE SegmentPteTemplate; 00401 ULONG NumberOfCommittedPages; 00402 PMMEXTEND_INFO ExtendInfo; 00403 SEGMENT_FLAGS SegmentFlags; 00404 PVOID BasedAddress; 00405 union 00406 { 00407 SIZE_T ImageCommitment; 00408 PEPROCESS CreatingProcess; 00409 } u1; 00410 union 00411 { 00412 PSECTION_IMAGE_INFORMATION ImageInformation; 00413 PVOID FirstMappedVa; 00414 } u2; 00415 PMMPTE PrototypePte; 00416 MMPTE ThePtes[1]; 00417 } SEGMENT, *PSEGMENT; 00418 00419 // 00420 // Event Counter Structure 00421 // 00422 typedef struct _EVENT_COUNTER 00423 { 00424 SLIST_ENTRY ListEntry; 00425 ULONG RefCount; 00426 KEVENT Event; 00427 } EVENT_COUNTER, *PEVENT_COUNTER; 00428 00429 // 00430 // Flags 00431 // 00432 typedef struct _MMSECTION_FLAGS 00433 { 00434 ULONG BeingDeleted:1; 00435 ULONG BeingCreated:1; 00436 ULONG BeingPurged:1; 00437 ULONG NoModifiedWriting:1; 00438 ULONG FailAllIo:1; 00439 ULONG Image:1; 00440 ULONG Based:1; 00441 ULONG File:1; 00442 ULONG Networked:1; 00443 ULONG NoCache:1; 00444 ULONG PhysicalMemory:1; 00445 ULONG CopyOnWrite:1; 00446 ULONG Reserve:1; 00447 ULONG Commit:1; 00448 ULONG FloppyMedia:1; 00449 ULONG WasPurged:1; 00450 ULONG UserReference:1; 00451 ULONG GlobalMemory:1; 00452 ULONG DeleteOnClose:1; 00453 ULONG FilePointerNull:1; 00454 ULONG DebugSymbolsLoaded:1; 00455 ULONG SetMappedFileIoComplete:1; 00456 ULONG CollidedFlush:1; 00457 ULONG NoChange:1; 00458 ULONG filler0:1; 00459 ULONG ImageMappedInSystemSpace:1; 00460 ULONG UserWritable:1; 00461 ULONG Accessed:1; 00462 ULONG GlobalOnlyPerSession:1; 00463 ULONG Rom:1; 00464 ULONG WriteCombined:1; 00465 ULONG filler:1; 00466 } MMSECTION_FLAGS, *PMMSECTION_FLAGS; 00467 00468 typedef struct _MMSUBSECTION_FLAGS 00469 { 00470 ULONG ReadOnly:1; 00471 ULONG ReadWrite:1; 00472 ULONG SubsectionStatic:1; 00473 ULONG GlobalMemory:1; 00474 ULONG Protection:5; 00475 ULONG Spare:1; 00476 ULONG StartingSector4132:10; 00477 ULONG SectorEndOffset:12; 00478 } MMSUBSECTION_FLAGS, *PMMSUBSECTION_FLAGS; 00479 00480 typedef struct _MMSUBSECTION_FLAGS2 00481 { 00482 ULONG SubsectionAccessed:1; 00483 ULONG SubsectionConverted:1; 00484 ULONG Reserved:30; 00485 } MMSUBSECTION_FLAGS2; 00486 00487 // 00488 // Control Area Structures 00489 // 00490 typedef struct _CONTROL_AREA 00491 { 00492 PSEGMENT Segment; 00493 LIST_ENTRY DereferenceList; 00494 ULONG NumberOfSectionReferences; 00495 ULONG NumberOfPfnReferences; 00496 ULONG NumberOfMappedViews; 00497 ULONG NumberOfSystemCacheViews; 00498 ULONG NumberOfUserReferences; 00499 union 00500 { 00501 ULONG LongFlags; 00502 MMSECTION_FLAGS Flags; 00503 } u; 00504 PFILE_OBJECT FilePointer; 00505 PEVENT_COUNTER WaitingForDeletion; 00506 USHORT ModifiedWriteCount; 00507 USHORT FlushInProgressCount; 00508 ULONG WritableUserReferences; 00509 ULONG QuadwordPad; 00510 } CONTROL_AREA, *PCONTROL_AREA; 00511 00512 typedef struct _LARGE_CONTROL_AREA 00513 { 00514 PSEGMENT Segment; 00515 LIST_ENTRY DereferenceList; 00516 ULONG NumberOfSectionReferences; 00517 ULONG NumberOfPfnReferences; 00518 ULONG NumberOfMappedViews; 00519 ULONG NumberOfSystemCacheViews; 00520 ULONG NumberOfUserReferences; 00521 union 00522 { 00523 ULONG LongFlags; 00524 MMSECTION_FLAGS Flags; 00525 } u; 00526 PFILE_OBJECT FilePointer; 00527 PEVENT_COUNTER WaitingForDeletion; 00528 USHORT ModifiedWriteCount; 00529 USHORT FlushInProgressCount; 00530 ULONG WritableUserReferences; 00531 ULONG QuadwordPad; 00532 ULONG StartingFrame; 00533 LIST_ENTRY UserGlobalList; 00534 ULONG SessionId; 00535 } LARGE_CONTROL_AREA, *PLARGE_CONTROL_AREA; 00536 00537 // 00538 // Subsection and Mapped Subsection 00539 // 00540 typedef struct _SUBSECTION 00541 { 00542 PCONTROL_AREA ControlArea; 00543 union 00544 { 00545 ULONG LongFlags; 00546 MMSUBSECTION_FLAGS SubsectionFlags; 00547 } u; 00548 ULONG StartingSector; 00549 ULONG NumberOfFullSectors; 00550 PMMPTE SubsectionBase; 00551 ULONG UnusedPtes; 00552 ULONG PtesInSubsection; 00553 struct _SUBSECTION *NextSubsection; 00554 } SUBSECTION, *PSUBSECTION; 00555 00556 typedef struct _MSUBSECTION 00557 { 00558 PCONTROL_AREA ControlArea; 00559 union 00560 { 00561 ULONG LongFlags; 00562 MMSUBSECTION_FLAGS SubsectionFlags; 00563 } u; 00564 ULONG StartingSector; 00565 ULONG NumberOfFullSectors; 00566 PMMPTE SubsectionBase; 00567 ULONG UnusedPtes; 00568 ULONG PtesInSubsection; 00569 struct _SUBSECTION *NextSubsection; 00570 LIST_ENTRY DereferenceList; 00571 ULONG_PTR NumberOfMappedViews; 00572 union 00573 { 00574 ULONG LongFlags2; 00575 MMSUBSECTION_FLAGS2 SubsectionFlags2; 00576 } u2; 00577 } MSUBSECTION, *PMSUBSECTION; 00578 00579 // 00580 // Segment Object 00581 // 00582 typedef struct _SEGMENT_OBJECT 00583 { 00584 PVOID BaseAddress; 00585 ULONG TotalNumberOfPtes; 00586 LARGE_INTEGER SizeOfSegment; 00587 ULONG NonExtendedPtes; 00588 ULONG ImageCommitment; 00589 PCONTROL_AREA ControlArea; 00590 PSUBSECTION Subsection; 00591 PLARGE_CONTROL_AREA LargeControlArea; 00592 PMMSECTION_FLAGS MmSectionFlags; 00593 PMMSUBSECTION_FLAGS MmSubSectionFlags; 00594 } SEGMENT_OBJECT, *PSEGMENT_OBJECT; 00595 00596 // 00597 // Section Object 00598 // 00599 typedef struct _SECTION_OBJECT 00600 { 00601 PVOID StartingVa; 00602 PVOID EndingVa; 00603 PVOID LeftChild; 00604 PVOID RightChild; 00605 PSEGMENT_OBJECT Segment; 00606 } SECTION_OBJECT, *PSECTION_OBJECT; 00607 00608 // 00609 // Generic Address Range Structure 00610 // 00611 typedef struct _ADDRESS_RANGE 00612 { 00613 ULONG BaseAddrLow; 00614 ULONG BaseAddrHigh; 00615 ULONG LengthLow; 00616 ULONG LengthHigh; 00617 ULONG Type; 00618 } ADDRESS_RANGE, *PADDRESS_RANGE; 00619 00620 // 00621 // Node in Memory Manager's AVL Table 00622 // 00623 typedef struct _MMADDRESS_NODE 00624 { 00625 union 00626 { 00627 LONG_PTR Balance:2; 00628 struct _MMADDRESS_NODE *Parent; 00629 } u1; 00630 struct _MMADDRESS_NODE *LeftChild; 00631 struct _MMADDRESS_NODE *RightChild; 00632 ULONG_PTR StartingVpn; 00633 ULONG_PTR EndingVpn; 00634 } MMADDRESS_NODE, *PMMADDRESS_NODE; 00635 00636 // 00637 // Memory Manager AVL Table for VADs and other descriptors 00638 // 00639 typedef struct _MM_AVL_TABLE 00640 { 00641 MMADDRESS_NODE BalancedRoot; 00642 ULONG_PTR DepthOfTree:5; 00643 ULONG_PTR Unused:3; 00644 #ifdef _WIN64 00645 ULONG_PTR NumberGenericTableElements:56; 00646 #else 00647 ULONG_PTR NumberGenericTableElements:24; 00648 #endif 00649 PVOID NodeHint; 00650 PVOID NodeFreeHint; 00651 } MM_AVL_TABLE, *PMM_AVL_TABLE; 00652 00653 // 00654 // Virtual Adress List used in VADs 00655 // 00656 typedef struct _MMADDRESS_LIST 00657 { 00658 ULONG_PTR StartVpn; 00659 ULONG_PTR EndVpn; 00660 } MMADDRESS_LIST, *PMMADDRESS_LIST; 00661 00662 // 00663 // Flags used in the VAD 00664 // 00665 typedef struct _MMVAD_FLAGS 00666 { 00667 #ifdef _WIN64 00668 ULONG_PTR CommitCharge:51; 00669 #else 00670 ULONG_PTR CommitCharge:19; 00671 #endif 00672 ULONG_PTR NoChange:1; 00673 ULONG_PTR VadType:3; 00674 ULONG_PTR MemCommit:1; 00675 ULONG_PTR Protection:5; 00676 ULONG_PTR Spare:2; 00677 ULONG_PTR PrivateMemory:1; 00678 } MMVAD_FLAGS, *PMMVAD_FLAGS; 00679 00680 // 00681 // Extended flags used in the VAD 00682 // 00683 typedef struct _MMVAD_FLAGS2 00684 { 00685 ULONG FileOffset:24; 00686 ULONG SecNoChange:1; 00687 ULONG OneSecured:1; 00688 ULONG MultipleSecured:1; 00689 ULONG ReadOnly:1; 00690 ULONG LongVad:1; 00691 ULONG ExtendableFile:1; 00692 ULONG Inherit:1; 00693 ULONG CopyOnWrite:1; 00694 } MMVAD_FLAGS2, *PMMVAD_FLAGS2; 00695 00696 // 00697 // Virtual Address Descriptor (VAD) Structure 00698 // 00699 typedef struct _MMVAD 00700 { 00701 union 00702 { 00703 LONG_PTR Balance:2; 00704 struct _MMVAD *Parent; 00705 } u1; 00706 struct _MMVAD *LeftChild; 00707 struct _MMVAD *RightChild; 00708 ULONG_PTR StartingVpn; 00709 ULONG_PTR EndingVpn; 00710 union 00711 { 00712 ULONG_PTR LongFlags; 00713 MMVAD_FLAGS VadFlags; 00714 } u; 00715 PCONTROL_AREA ControlArea; 00716 PMMPTE FirstPrototypePte; 00717 PMMPTE LastContiguousPte; 00718 union 00719 { 00720 ULONG LongFlags2; 00721 MMVAD_FLAGS2 VadFlags2; 00722 } u2; 00723 } MMVAD, *PMMVAD; 00724 00725 // 00726 // Long VAD used in section and private allocations 00727 // 00728 typedef struct _MMVAD_LONG 00729 { 00730 union 00731 { 00732 LONG_PTR Balance:2; 00733 PMMVAD Parent; 00734 } u1; 00735 PMMVAD LeftChild; 00736 PMMVAD RightChild; 00737 ULONG_PTR StartingVpn; 00738 ULONG_PTR EndingVpn; 00739 union 00740 { 00741 ULONG_PTR LongFlags; 00742 MMVAD_FLAGS VadFlags; 00743 } u; 00744 PCONTROL_AREA ControlArea; 00745 PMMPTE FirstPrototypePte; 00746 PMMPTE LastContiguousPte; 00747 union 00748 { 00749 ULONG LongFlags2; 00750 MMVAD_FLAGS2 VadFlags2; 00751 } u2; 00752 union 00753 { 00754 LIST_ENTRY List; 00755 MMADDRESS_LIST Secured; 00756 } u3; 00757 union 00758 { 00759 PVOID Banked; 00760 PMMEXTEND_INFO ExtendedInfo; 00761 } u4; 00762 } MMVAD_LONG, *PMMVAD_LONG; 00763 00764 // 00765 // Short VAD used in virtual memory allocations 00766 // 00767 typedef struct _MMVAD_SHORT 00768 { 00769 union 00770 { 00771 LONG_PTR Balance:2; 00772 PMMVAD Parent; 00773 } u1; 00774 PMMVAD LeftChild; 00775 PMMVAD RightChild; 00776 ULONG_PTR StartingVpn; 00777 ULONG_PTR EndingVpn; 00778 union 00779 { 00780 ULONG_PTR LongFlags; 00781 MMVAD_FLAGS VadFlags; 00782 } u; 00783 } MMVAD_SHORT, *PMMVAD_SHORT; 00784 00785 // 00786 // Actual Section Object 00787 // 00788 typedef struct _SECTION 00789 { 00790 MMADDRESS_NODE Address; 00791 PSEGMENT Segment; 00792 LARGE_INTEGER SizeOfSection; 00793 union 00794 { 00795 ULONG LongFlags; 00796 MMSECTION_FLAGS Flags; 00797 } u; 00798 ULONG InitialPageProtection; 00799 } SECTION, *PSECTION; 00800 00801 // 00802 // Memory Manager Working Set Structures 00803 // 00804 typedef struct _MMWSLENTRY 00805 { 00806 ULONG Valid:1; 00807 ULONG LockedInWs:1; 00808 ULONG LockedInMemory:1; 00809 ULONG Protection:5; 00810 ULONG Hashed:1; 00811 ULONG Direct:1; 00812 ULONG Age:2; 00813 ULONG VirtualPageNumber:20; 00814 } MMWSLENTRY, *PMMWSLENTRY; 00815 00816 typedef struct _MMWSLE 00817 { 00818 union 00819 { 00820 PVOID VirtualAddress; 00821 ULONG Long; 00822 MMWSLENTRY e1; 00823 } u1; 00824 } MMWSLE, *PMMWSLE; 00825 00826 typedef struct _MMWSLE_HASH 00827 { 00828 PVOID Key; 00829 ULONG Index; 00830 } MMWSLE_HASH, *PMMWSLE_HASH; 00831 00832 typedef struct _MMWSL 00833 { 00834 ULONG FirstFree; 00835 ULONG FirstDynamic; 00836 ULONG LastEntry; 00837 ULONG NextSlot; 00838 PMMWSLE Wsle; 00839 ULONG LastInitializedWsle; 00840 ULONG NonDirectCount; 00841 PMMWSLE_HASH HashTable; 00842 ULONG HashTableSize; 00843 ULONG NumberOfCommittedPageTables; 00844 PVOID HashTableStart; 00845 PVOID HighestPermittedHashAddress; 00846 ULONG NumberOfImageWaiters; 00847 ULONG VadBitMapHint; 00848 USHORT UsedPageTableEntries[768]; 00849 ULONG CommittedPageTables[24]; 00850 } MMWSL, *PMMWSL; 00851 00852 // 00853 // Flags for Memory Support Structure 00854 // 00855 typedef struct _MMSUPPORT_FLAGS 00856 { 00857 ULONG SessionSpace:1; 00858 ULONG BeingTrimmed:1; 00859 ULONG SessionLeader:1; 00860 ULONG TrimHard:1; 00861 ULONG MaximumWorkingSetHard:1; 00862 ULONG ForceTrim:1; 00863 ULONG MinimumWorkingSetHard:1; 00864 ULONG Available0:1; 00865 ULONG MemoryPriority:8; 00866 ULONG GrowWsleHash:1; 00867 ULONG AcquiredUnsafe:1; 00868 ULONG Available:14; 00869 } MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS; 00870 00871 // 00872 // Per-Process Memory Manager Data 00873 // 00874 typedef struct _MMSUPPORT 00875 { 00876 #if (NTDDI_VERSION >= NTDDI_WS03) 00877 LIST_ENTRY WorkingSetExpansionLinks; 00878 #endif 00879 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 00880 USHORT LastTrimpStamp; 00881 USHORT NextPageColor; 00882 #else 00883 LARGE_INTEGER LastTrimTime; 00884 #endif 00885 MMSUPPORT_FLAGS Flags; 00886 ULONG PageFaultCount; 00887 ULONG PeakWorkingSetSize; 00888 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 00889 ULONG Spare0; 00890 #else 00891 ULONG GrowthSinceLastEstimate; 00892 #endif 00893 ULONG MinimumWorkingSetSize; 00894 ULONG MaximumWorkingSetSize; 00895 PMMWSL VmWorkingSetList; 00896 #if (NTDDI_VERSION < NTDDI_WS03) 00897 LIST_ENTRY WorkingSetExpansionLinks; 00898 #endif 00899 ULONG Claim; 00900 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 00901 ULONG Spare; 00902 ULONG WorkingSetPrivateSize; 00903 ULONG WorkingSetSizeOverhead; 00904 #else 00905 ULONG NextEstimationSlot; 00906 ULONG NextAgingSlot; 00907 ULONG EstimatedAvailable; 00908 #endif 00909 ULONG WorkingSetSize; 00910 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 00911 PKEVENT ExitEvent; 00912 #endif 00913 EX_PUSH_LOCK WorkingSetMutex; 00914 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 00915 PVOID AccessLog; 00916 #endif 00917 } MMSUPPORT, *PMMSUPPORT; 00918 00919 // 00920 // Memory Information Types 00921 // 00922 typedef struct _MEMORY_BASIC_INFORMATION 00923 { 00924 PVOID BaseAddress; 00925 PVOID AllocationBase; 00926 ULONG AllocationProtect; 00927 SIZE_T RegionSize; 00928 ULONG State; 00929 ULONG Protect; 00930 ULONG Type; 00931 } MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION; 00932 00933 // 00934 // Driver Verifier Data 00935 // 00936 typedef struct _MM_DRIVER_VERIFIER_DATA 00937 { 00938 ULONG Level; 00939 ULONG RaiseIrqls; 00940 ULONG AcquireSpinLocks; 00941 ULONG SynchronizeExecutions; 00942 ULONG AllocationsAttempted; 00943 ULONG AllocationsSucceeded; 00944 ULONG AllocationsSucceededSpecialPool; 00945 ULONG AllocationsWithNoTag; 00946 ULONG TrimRequests; 00947 ULONG Trims; 00948 ULONG AllocationsFailed; 00949 ULONG AllocationsFailedDeliberately; 00950 ULONG Loads; 00951 ULONG Unloads; 00952 ULONG UnTrackedPool; 00953 ULONG UserTrims; 00954 ULONG CurrentPagedPoolAllocations; 00955 ULONG CurrentNonPagedPoolAllocations; 00956 ULONG PeakPagedPoolAllocations; 00957 ULONG PeakNonPagedPoolAllocations; 00958 ULONG PagedBytes; 00959 ULONG NonPagedBytes; 00960 ULONG PeakPagedBytes; 00961 ULONG PeakNonPagedBytes; 00962 ULONG BurstAllocationsFailedDeliberately; 00963 ULONG SessionTrims; 00964 ULONG Reserved[2]; 00965 } MM_DRIVER_VERIFIER_DATA, *PMM_DRIVER_VERIFIER_DATA; 00966 00967 // 00968 // Internal Driver Verifier Table Data 00969 // 00970 typedef struct _DRIVER_SPECIFIED_VERIFIER_THUNKS 00971 { 00972 LIST_ENTRY ListEntry; 00973 struct _LDR_DATA_TABLE_ENTRY *DataTableEntry; 00974 ULONG NumberOfThunks; 00975 } DRIVER_SPECIFIED_VERIFIER_THUNKS, *PDRIVER_SPECIFIED_VERIFIER_THUNKS; 00976 00977 // 00978 // Default heap size values. For user mode, these values are copied to a new 00979 // process's PEB by the kernel in MmCreatePeb. In kernel mode, RtlCreateHeap 00980 // reads these variables directly. 00981 // 00982 // These variables should be considered "const"; they are written only once, 00983 // during MmInitSystem. 00984 // 00985 extern SIZE_T MmHeapSegmentReserve; 00986 extern SIZE_T MmHeapSegmentCommit; 00987 extern SIZE_T MmHeapDeCommitTotalFreeThreshold; 00988 extern SIZE_T MmHeapDeCommitFreeBlockThreshold; 00989 00990 // 00991 // Section Object Type 00992 // 00993 extern POBJECT_TYPE NTSYSAPI MmSectionObjectType; 00994 00995 #endif // !NTOS_MODE_USER 00996 00997 #endif // _MMTYPES_H Generated on Sat May 26 2012 04:29:27 for ReactOS by
1.7.6.1
|