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

miarm.h
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS Kernel
00003  * LICENSE:         BSD - See COPYING.ARM in the top level directory
00004  * FILE:            ntoskrnl/mm/ARM3/miarm.h
00005  * PURPOSE:         ARM Memory Manager Header
00006  * PROGRAMMERS:     ReactOS Portable Systems Group
00007  */
00008 
00009 #ifndef _M_AMD64
00010 
00011 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING   ((255 * _1MB) >> PAGE_SHIFT)
00012 #define MI_MIN_PAGES_FOR_SYSPTE_TUNING          ((19 * _1MB) >> PAGE_SHIFT)
00013 #define MI_MIN_PAGES_FOR_SYSPTE_BOOST           ((32 * _1MB) >> PAGE_SHIFT)
00014 #define MI_MAX_INIT_NONPAGED_POOL_SIZE          (128 * _1MB)
00015 #define MI_MAX_NONPAGED_POOL_SIZE               (128 * _1MB)
00016 #define MI_MAX_FREE_PAGE_LISTS                  4
00017 
00018 #define MI_MIN_INIT_PAGED_POOLSIZE              (32 * _1MB)
00019 
00020 #define MI_SESSION_VIEW_SIZE                    (20 * _1MB)
00021 #define MI_SESSION_POOL_SIZE                    (16 * _1MB)
00022 #define MI_SESSION_IMAGE_SIZE                   (8 * _1MB)
00023 #define MI_SESSION_WORKING_SET_SIZE             (4 * _1MB)
00024 #define MI_SESSION_SIZE                         (MI_SESSION_VIEW_SIZE + \
00025                                                  MI_SESSION_POOL_SIZE + \
00026                                                  MI_SESSION_IMAGE_SIZE + \
00027                                                  MI_SESSION_WORKING_SET_SIZE)
00028 
00029 #define MI_SYSTEM_VIEW_SIZE                     (32 * _1MB)
00030 
00031 #define MI_HIGHEST_USER_ADDRESS                 (PVOID)0x7FFEFFFF
00032 #define MI_USER_PROBE_ADDRESS                   (PVOID)0x7FFF0000
00033 #define MI_DEFAULT_SYSTEM_RANGE_START           (PVOID)0x80000000
00034 #define MI_SYSTEM_CACHE_WS_START                (PVOID)0xC0C00000
00035 #define MI_PAGED_POOL_START                     (PVOID)0xE1000000
00036 #define MI_NONPAGED_POOL_END                    (PVOID)0xFFBE0000
00037 #define MI_DEBUG_MAPPING                        (PVOID)0xFFBFF000
00038 
00039 #define MI_SYSTEM_PTE_BASE                      (PVOID)MiAddressToPte(NULL)
00040 
00041 #define MI_MIN_SECONDARY_COLORS                 8
00042 #define MI_SECONDARY_COLORS                     64
00043 #define MI_MAX_SECONDARY_COLORS                 1024
00044 
00045 #define MI_MIN_ALLOCATION_FRAGMENT              (4 * _1KB)
00046 #define MI_ALLOCATION_FRAGMENT                  (64 * _1KB)
00047 #define MI_MAX_ALLOCATION_FRAGMENT              (2  * _1MB)
00048 
00049 #define MM_HIGHEST_VAD_ADDRESS \
00050     (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
00051 #define MI_LOWEST_VAD_ADDRESS                   (PVOID)MM_LOWEST_USER_ADDRESS
00052 
00053 #endif /* !_M_AMD64 */
00054 
00055 /* Make the code cleaner with some definitions for size multiples */
00056 #define _1KB (1024u)
00057 #define _1MB (1024 * _1KB)
00058 #define _1GB (1024 * _1MB)
00059 
00060 /* Everyone loves 64K */
00061 #define _64K (64 * _1KB)
00062 
00063 /* Area mapped by a PDE */
00064 #define PDE_MAPPED_VA  (PTE_COUNT * PAGE_SIZE)
00065 
00066 /* Size of a page table */
00067 #define PT_SIZE  (PTE_COUNT * sizeof(MMPTE))
00068 
00069 /* Size of a page directory */
00070 #define PD_SIZE  (PDE_COUNT * sizeof(MMPDE))
00071 
00072 /* Size of all page directories for a process */
00073 #define SYSTEM_PD_SIZE (PD_COUNT * PD_SIZE)
00074 
00075 /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */
00076 #ifdef _M_IX86
00077 #define PD_COUNT  1
00078 #define PDE_COUNT 1024
00079 #define PTE_COUNT 1024
00080 C_ASSERT(SYSTEM_PD_SIZE == PAGE_SIZE);
00081 #define MiIsPteOnPdeBoundary(PointerPte) \
00082     ((((ULONG_PTR)PointerPte) & (PAGE_SIZE - 1)) == 0)
00083 #elif _M_ARM
00084 #define PD_COUNT  1
00085 #define PDE_COUNT 4096
00086 #define PTE_COUNT 256
00087 #else
00088 #define PD_COUNT  PPE_PER_PAGE
00089 #define PDE_COUNT PDE_PER_PAGE
00090 #define PTE_COUNT PTE_PER_PAGE
00091 #endif
00092 
00093 //
00094 // Protection Bits part of the internal memory manager Protection Mask
00095 // Taken from http://www.reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel
00096 // and public assertions.
00097 //
00098 #define MM_ZERO_ACCESS         0
00099 #define MM_READONLY            1
00100 #define MM_EXECUTE             2
00101 #define MM_EXECUTE_READ        3
00102 #define MM_READWRITE           4
00103 #define MM_WRITECOPY           5
00104 #define MM_EXECUTE_READWRITE   6
00105 #define MM_EXECUTE_WRITECOPY   7
00106 #define MM_NOCACHE             8
00107 #define MM_DECOMMIT            0x10
00108 #define MM_NOACCESS            (MM_DECOMMIT | MM_NOCACHE)
00109 #define MM_INVALID_PROTECTION  0xFFFFFFFF
00110 
00111 //
00112 // Specific PTE Definitions that map to the Memory Manager's Protection Mask Bits
00113 // The Memory Manager's definition define the attributes that must be preserved
00114 // and these PTE definitions describe the attributes in the hardware sense. This
00115 // helps deal with hardware differences between the actual boolean expression of
00116 // the argument.
00117 //
00118 // For example, in the logical attributes, we want to express read-only as a flag
00119 // but on x86, it is writability that must be set. On the other hand, on x86, just
00120 // like in the kernel, it is disabling the caches that requires a special flag,
00121 // while on certain architectures such as ARM, it is enabling the cache which
00122 // requires a flag.
00123 //
00124 #if defined(_M_IX86) || defined(_M_AMD64)
00125 //
00126 // Access Flags
00127 //
00128 #define PTE_READONLY            0 // Doesn't exist on x86
00129 #define PTE_EXECUTE             0 // Not worrying about NX yet
00130 #define PTE_EXECUTE_READ        0 // Not worrying about NX yet
00131 #define PTE_READWRITE           0x2
00132 #define PTE_WRITECOPY           0x200
00133 #define PTE_EXECUTE_READWRITE   0x2 // Not worrying about NX yet
00134 #define PTE_EXECUTE_WRITECOPY   0x200
00135 #define PTE_PROTOTYPE           0x400
00136 
00137 //
00138 // State Flags
00139 //
00140 #define PTE_VALID               0x1
00141 #define PTE_ACCESSED            0x20
00142 #define PTE_DIRTY               0x40
00143 
00144 //
00145 // Cache flags
00146 //
00147 #define PTE_ENABLE_CACHE        0
00148 #define PTE_DISABLE_CACHE       0x10
00149 #define PTE_WRITECOMBINED_CACHE 0x10
00150 #elif defined(_M_ARM)
00151 #define PTE_READONLY            0x200
00152 #define PTE_EXECUTE             0 // Not worrying about NX yet
00153 #define PTE_EXECUTE_READ        0 // Not worrying about NX yet
00154 #define PTE_READWRITE           0 // Doesn't exist on ARM
00155 #define PTE_WRITECOPY           0 // Doesn't exist on ARM
00156 #define PTE_EXECUTE_READWRITE   0 // Not worrying about NX yet
00157 #define PTE_EXECUTE_WRITECOPY   0 // Not worrying about NX yet
00158 #define PTE_PROTOTYPE           0x400 // Using the Shared bit
00159 //
00160 // Cache flags
00161 //
00162 #define PTE_ENABLE_CACHE        0
00163 #define PTE_DISABLE_CACHE       0x10
00164 #define PTE_WRITECOMBINED_CACHE 0x10
00165 #else
00166 #error Define these please!
00167 #endif
00168 
00169 extern const ULONG_PTR MmProtectToPteMask[32];
00170 extern const ULONG MmProtectToValue[32];
00171 
00172 //
00173 // Assertions for session images, addresses, and PTEs
00174 //
00175 #define MI_IS_SESSION_IMAGE_ADDRESS(Address) \
00176     (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd))
00177 
00178 #define MI_IS_SESSION_ADDRESS(Address) \
00179     (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd))
00180 
00181 #define MI_IS_SESSION_PTE(Pte) \
00182     ((((PMMPTE)Pte) >= MiSessionBasePte) && (((PMMPTE)Pte) < MiSessionLastPte))
00183 
00184 #define MI_IS_PAGE_TABLE_ADDRESS(Address) \
00185     (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)PTE_TOP))
00186 
00187 #define MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address) \
00188     (((Address) >= (PVOID)MiAddressToPte(MmSystemRangeStart)) && ((Address) <= (PVOID)PTE_TOP))
00189 
00190 #define MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address) \
00191     (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)MmHyperSpaceEnd))
00192 
00193 //
00194 // Corresponds to MMPTE_SOFTWARE.Protection
00195 //
00196 #ifdef _M_IX86
00197 #define MM_PTE_SOFTWARE_PROTECTION_BITS   5
00198 #elif _M_ARM
00199 #define MM_PTE_SOFTWARE_PROTECTION_BITS   6
00200 #elif _M_AMD64
00201 #define MM_PTE_SOFTWARE_PROTECTION_BITS   5
00202 #else
00203 #error Define these please!
00204 #endif
00205 
00206 //
00207 // Creates a software PTE with the given protection
00208 //
00209 #define MI_MAKE_SOFTWARE_PTE(p, x)          ((p)->u.Long = (x << MM_PTE_SOFTWARE_PROTECTION_BITS))
00210 
00211 //
00212 // Marks a PTE as deleted
00213 //
00214 #define MI_SET_PFN_DELETED(x)               ((x)->PteAddress = (PMMPTE)((ULONG_PTR)(x)->PteAddress | 1))
00215 #define MI_IS_PFN_DELETED(x)                ((ULONG_PTR)((x)->PteAddress) & 1)
00216 
00217 //
00218 // Special values for LoadedImports
00219 //
00220 #define MM_SYSLDR_NO_IMPORTS   (PVOID)0xFFFFFFFE
00221 #define MM_SYSLDR_BOOT_LOADED  (PVOID)0xFFFFFFFF
00222 #define MM_SYSLDR_SINGLE_ENTRY 0x1
00223 
00224 #if defined(_M_IX86) || defined(_M_ARM)
00225 //
00226 // PFN List Sentinel
00227 //
00228 #define LIST_HEAD 0xFFFFFFFF
00229 
00230 //
00231 // Because GCC cannot automatically downcast 0xFFFFFFFF to lesser-width bits,
00232 // we need a manual definition suited to the number of bits in the PteFrame.
00233 // This is used as a LIST_HEAD for the colored list
00234 //
00235 #define COLORED_LIST_HEAD ((1 << 25) - 1) // 0x1FFFFFF
00236 #elif defined(_M_AMD64)
00237 #define LIST_HEAD 0xFFFFFFFFFFFFFFFFLL
00238 #define COLORED_LIST_HEAD ((1ULL << 57) - 1) // 0x1FFFFFFFFFFFFFFLL
00239 #else
00240 #error Define these please!
00241 #endif
00242 
00243 //
00244 // Special IRQL value (found in assertions)
00245 //
00246 #define MM_NOIRQL (KIRQL)0xFFFFFFFF
00247 
00248 //
00249 // Returns the color of a page
00250 //
00251 #define MI_GET_PAGE_COLOR(x)                ((x) & MmSecondaryColorMask)
00252 #define MI_GET_NEXT_COLOR()                 (MI_GET_PAGE_COLOR(++MmSystemPageColor))
00253 #define MI_GET_NEXT_PROCESS_COLOR(x)        (MI_GET_PAGE_COLOR(++(x)->NextPageColor))
00254 
00255 #ifndef _M_AMD64
00256 //
00257 // Decodes a Prototype PTE into the underlying PTE
00258 //
00259 #define MiProtoPteToPte(x)                  \
00260     (PMMPTE)((ULONG_PTR)MmPagedPoolStart +  \
00261              (((x)->u.Proto.ProtoAddressHigh << 7) | (x)->u.Proto.ProtoAddressLow))
00262 #endif
00263 
00264 //
00265 // Prototype PTEs that don't yet have a pagefile association
00266 //
00267 #ifdef _M_AMD64
00268 #define MI_PTE_LOOKUP_NEEDED 0xffffffffULL
00269 #else
00270 #define MI_PTE_LOOKUP_NEEDED 0xFFFFF
00271 #endif
00272 
00273 //
00274 // System views are binned into 64K chunks
00275 //
00276 #define MI_SYSTEM_VIEW_BUCKET_SIZE  _64K
00277 
00278 //
00279 // FIXFIX: These should go in ex.h after the pool merge
00280 //
00281 #ifdef _M_AMD64
00282 #define POOL_BLOCK_SIZE 16
00283 #else
00284 #define POOL_BLOCK_SIZE  8
00285 #endif
00286 #define POOL_LISTS_PER_PAGE (PAGE_SIZE / POOL_BLOCK_SIZE)
00287 #define BASE_POOL_TYPE_MASK 1
00288 #define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + POOL_BLOCK_SIZE))
00289 
00290 //
00291 // Pool debugging/analysis/tracing flags
00292 //
00293 #define POOL_FLAG_CHECK_TIMERS 0x1
00294 #define POOL_FLAG_CHECK_WORKERS 0x2
00295 #define POOL_FLAG_CHECK_RESOURCES 0x4
00296 #define POOL_FLAG_VERIFIER 0x8
00297 #define POOL_FLAG_CHECK_DEADLOCK 0x10
00298 #define POOL_FLAG_SPECIAL_POOL 0x20
00299 #define POOL_FLAG_DBGPRINT_ON_FAILURE 0x40
00300 #define POOL_FLAG_CRASH_ON_FAILURE 0x80
00301 
00302 //
00303 // BAD_POOL_HEADER codes during pool bugcheck
00304 //
00305 #define POOL_CORRUPTED_LIST 3
00306 #define POOL_SIZE_OR_INDEX_MISMATCH 5
00307 #define POOL_ENTRIES_NOT_ALIGNED_PREVIOUS 6
00308 #define POOL_HEADER_NOT_ALIGNED 7
00309 #define POOL_HEADER_IS_ZERO 8
00310 #define POOL_ENTRIES_NOT_ALIGNED_NEXT 9
00311 #define POOL_ENTRY_NOT_FOUND 10
00312 
00313 //
00314 // BAD_POOL_CALLER codes during pool bugcheck
00315 //
00316 #define POOL_ENTRY_CORRUPTED 1
00317 #define POOL_ENTRY_ALREADY_FREE 6
00318 #define POOL_ENTRY_NOT_ALLOCATED 7
00319 #define POOL_ALLOC_IRQL_INVALID 8
00320 #define POOL_FREE_IRQL_INVALID 9
00321 #define POOL_BILLED_PROCESS_INVALID 13
00322 #define POOL_HEADER_SIZE_INVALID 32
00323 
00324 typedef struct _POOL_DESCRIPTOR
00325 {
00326     POOL_TYPE PoolType;
00327     ULONG PoolIndex;
00328     ULONG RunningAllocs;
00329     ULONG RunningDeAllocs;
00330     ULONG TotalPages;
00331     ULONG TotalBigPages;
00332     ULONG Threshold;
00333     PVOID LockAddress;
00334     PVOID PendingFrees;
00335     LONG PendingFreeDepth;
00336     SIZE_T TotalBytes;
00337     SIZE_T Spare0;
00338     LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE];
00339 } POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
00340 
00341 typedef struct _POOL_HEADER
00342 {
00343     union
00344     {
00345         struct
00346         {
00347 #ifdef _M_AMD64
00348             USHORT PreviousSize:8;
00349             USHORT PoolIndex:8;
00350             USHORT BlockSize:8;
00351             USHORT PoolType:8;
00352 #else
00353             USHORT PreviousSize:9;
00354             USHORT PoolIndex:7;
00355             USHORT BlockSize:9;
00356             USHORT PoolType:7;
00357 #endif
00358         };
00359         ULONG Ulong1;
00360     };
00361 #ifdef _M_AMD64
00362     ULONG PoolTag;
00363 #endif
00364     union
00365     {
00366 #ifdef _M_AMD64
00367         PEPROCESS ProcessBilled;
00368 #else
00369         ULONG PoolTag;
00370 #endif
00371         struct
00372         {
00373             USHORT AllocatorBackTraceIndex;
00374             USHORT PoolTagHash;
00375         };
00376     };
00377 } POOL_HEADER, *PPOOL_HEADER;
00378 
00379 C_ASSERT(sizeof(POOL_HEADER) == POOL_BLOCK_SIZE);
00380 C_ASSERT(POOL_BLOCK_SIZE == sizeof(LIST_ENTRY));
00381 
00382 typedef struct _POOL_TRACKER_TABLE
00383 {
00384     ULONG Key;
00385     LONG NonPagedAllocs;
00386     LONG NonPagedFrees;
00387     SIZE_T NonPagedBytes;
00388     LONG PagedAllocs;
00389     LONG PagedFrees;
00390     SIZE_T PagedBytes;
00391 } POOL_TRACKER_TABLE, *PPOOL_TRACKER_TABLE;
00392 
00393 typedef struct _POOL_TRACKER_BIG_PAGES
00394 {
00395     PVOID Va;
00396     ULONG Key;
00397     ULONG NumberOfPages;
00398     PVOID QuotaObject;
00399 } POOL_TRACKER_BIG_PAGES, *PPOOL_TRACKER_BIG_PAGES;
00400 
00401 extern ULONG ExpNumberOfPagedPools;
00402 extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
00403 extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16 + 1];
00404 extern PPOOL_TRACKER_TABLE PoolTrackTable;
00405 
00406 //
00407 // END FIXFIX
00408 //
00409 
00410 typedef struct _MI_LARGE_PAGE_DRIVER_ENTRY
00411 {
00412     LIST_ENTRY Links;
00413     UNICODE_STRING BaseName;
00414 } MI_LARGE_PAGE_DRIVER_ENTRY, *PMI_LARGE_PAGE_DRIVER_ENTRY;
00415 
00416 typedef enum _MMSYSTEM_PTE_POOL_TYPE
00417 {
00418     SystemPteSpace,
00419     NonPagedPoolExpansion,
00420     MaximumPtePoolTypes
00421 } MMSYSTEM_PTE_POOL_TYPE;
00422 
00423 typedef enum _MI_PFN_CACHE_ATTRIBUTE
00424 {
00425     MiNonCached,
00426     MiCached,
00427     MiWriteCombined,
00428     MiNotMapped
00429 } MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
00430 
00431 typedef struct _PHYSICAL_MEMORY_RUN
00432 {
00433     PFN_NUMBER BasePage;
00434     PFN_NUMBER PageCount;
00435 } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
00436 
00437 typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
00438 {
00439     ULONG NumberOfRuns;
00440     PFN_NUMBER NumberOfPages;
00441     PHYSICAL_MEMORY_RUN Run[1];
00442 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
00443 
00444 typedef struct _MMCOLOR_TABLES
00445 {
00446     PFN_NUMBER Flink;
00447     PVOID Blink;
00448     PFN_NUMBER Count;
00449 } MMCOLOR_TABLES, *PMMCOLOR_TABLES;
00450 
00451 typedef struct _MI_LARGE_PAGE_RANGES
00452 {
00453     PFN_NUMBER StartFrame;
00454     PFN_NUMBER LastFrame;
00455 } MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES;
00456 
00457 typedef struct _MMVIEW
00458 {
00459     ULONG_PTR Entry;
00460     PCONTROL_AREA ControlArea;
00461 } MMVIEW, *PMMVIEW;
00462 
00463 typedef struct _MMSESSION
00464 {
00465     KGUARDED_MUTEX SystemSpaceViewLock;
00466     PKGUARDED_MUTEX SystemSpaceViewLockPointer;
00467     PCHAR SystemSpaceViewStart;
00468     PMMVIEW SystemSpaceViewTable;
00469     ULONG SystemSpaceHashSize;
00470     ULONG SystemSpaceHashEntries;
00471     ULONG SystemSpaceHashKey;
00472     ULONG BitmapFailures;
00473     PRTL_BITMAP SystemSpaceBitMap;
00474 } MMSESSION, *PMMSESSION;
00475 
00476 extern MMPTE HyperTemplatePte;
00477 extern MMPDE ValidKernelPde;
00478 extern MMPTE ValidKernelPte;
00479 extern MMPDE DemandZeroPde;
00480 extern MMPTE DemandZeroPte;
00481 extern MMPTE PrototypePte;
00482 extern MMPTE MmDecommittedPte;
00483 extern BOOLEAN MmLargeSystemCache;
00484 extern BOOLEAN MmZeroPageFile;
00485 extern BOOLEAN MmProtectFreedNonPagedPool;
00486 extern BOOLEAN MmTrackLockedPages;
00487 extern BOOLEAN MmTrackPtes;
00488 extern BOOLEAN MmDynamicPfn;
00489 extern BOOLEAN MmMirroring;
00490 extern BOOLEAN MmMakeLowMemory;
00491 extern BOOLEAN MmEnforceWriteProtection;
00492 extern SIZE_T MmAllocationFragment;
00493 extern ULONG MmConsumedPoolPercentage;
00494 extern ULONG MmVerifyDriverBufferType;
00495 extern ULONG MmVerifyDriverLevel;
00496 extern WCHAR MmVerifyDriverBuffer[512];
00497 extern WCHAR MmLargePageDriverBuffer[512];
00498 extern LIST_ENTRY MiLargePageDriverList;
00499 extern BOOLEAN MiLargePageAllDrivers;
00500 extern ULONG MmVerifyDriverBufferLength;
00501 extern ULONG MmLargePageDriverBufferLength;
00502 extern SIZE_T MmSizeOfNonPagedPoolInBytes;
00503 extern SIZE_T MmMaximumNonPagedPoolInBytes;
00504 extern PFN_NUMBER MmMaximumNonPagedPoolInPages;
00505 extern PFN_NUMBER MmSizeOfPagedPoolInPages;
00506 extern PVOID MmNonPagedSystemStart;
00507 extern SIZE_T MiNonPagedSystemSize;
00508 extern PVOID MmNonPagedPoolStart;
00509 extern PVOID MmNonPagedPoolExpansionStart;
00510 extern PVOID MmNonPagedPoolEnd;
00511 extern SIZE_T MmSizeOfPagedPoolInBytes;
00512 extern PVOID MmPagedPoolStart;
00513 extern PVOID MmPagedPoolEnd;
00514 extern PVOID MmSessionBase;
00515 extern SIZE_T MmSessionSize;
00516 extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
00517 extern PMMPTE MiFirstReservedZeroingPte;
00518 extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];
00519 extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
00520 extern SIZE_T MmBootImageSize;
00521 extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
00522 extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
00523 extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
00524 extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
00525 extern ULONG_PTR MxPfnAllocation;
00526 extern MM_PAGED_POOL_INFO MmPagedPoolInfo;
00527 extern RTL_BITMAP MiPfnBitMap;
00528 extern KGUARDED_MUTEX MmPagedPoolMutex;
00529 extern KGUARDED_MUTEX MmSectionCommitMutex;
00530 extern PVOID MmPagedPoolStart;
00531 extern PVOID MmPagedPoolEnd;
00532 extern PVOID MmNonPagedSystemStart;
00533 extern PVOID MiSystemViewStart;
00534 extern SIZE_T MmSystemViewSize;
00535 extern PVOID MmSessionBase;
00536 extern PVOID MiSessionSpaceEnd;
00537 extern PMMPTE MiSessionImagePteStart;
00538 extern PMMPTE MiSessionImagePteEnd;
00539 extern PMMPTE MiSessionBasePte;
00540 extern PMMPTE MiSessionLastPte;
00541 extern SIZE_T MmSizeOfPagedPoolInBytes;
00542 extern PMMPDE MmSystemPagePtes;
00543 extern PVOID MmSystemCacheStart;
00544 extern PVOID MmSystemCacheEnd;
00545 extern MMSUPPORT MmSystemCacheWs;
00546 extern SIZE_T MmAllocatedNonPagedPool;
00547 extern ULONG_PTR MmSubsectionBase;
00548 extern ULONG MmSpecialPoolTag;
00549 extern PVOID MmHyperSpaceEnd;
00550 extern PMMWSL MmSystemCacheWorkingSetList;
00551 extern SIZE_T MmMinimumNonPagedPoolSize;
00552 extern ULONG MmMinAdditionNonPagedPoolPerMb;
00553 extern SIZE_T MmDefaultMaximumNonPagedPool;
00554 extern ULONG MmMaxAdditionNonPagedPoolPerMb;
00555 extern ULONG MmSecondaryColors;
00556 extern ULONG MmSecondaryColorMask;
00557 extern ULONG MmNumberOfSystemPtes;
00558 extern ULONG MmMaximumNonPagedPoolPercent;
00559 extern ULONG MmLargeStackSize;
00560 extern PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
00561 extern MMPFNLIST MmStandbyPageListByPriority[8];
00562 extern ULONG MmProductType;
00563 extern MM_SYSTEMSIZE MmSystemSize;
00564 extern PKEVENT MiLowMemoryEvent;
00565 extern PKEVENT MiHighMemoryEvent;
00566 extern PKEVENT MiLowPagedPoolEvent;
00567 extern PKEVENT MiHighPagedPoolEvent;
00568 extern PKEVENT MiLowNonPagedPoolEvent;
00569 extern PKEVENT MiHighNonPagedPoolEvent;
00570 extern PFN_NUMBER MmLowMemoryThreshold;
00571 extern PFN_NUMBER MmHighMemoryThreshold;
00572 extern PFN_NUMBER MiLowPagedPoolThreshold;
00573 extern PFN_NUMBER MiHighPagedPoolThreshold;
00574 extern PFN_NUMBER MiLowNonPagedPoolThreshold;
00575 extern PFN_NUMBER MiHighNonPagedPoolThreshold;
00576 extern PFN_NUMBER MmMinimumFreePages;
00577 extern PFN_NUMBER MmPlentyFreePages;
00578 extern PFN_COUNT MiExpansionPoolPagesInitialCharge;
00579 extern PFN_NUMBER MmResidentAvailablePages;
00580 extern PFN_NUMBER MmResidentAvailableAtInit;
00581 extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes];
00582 extern PFN_NUMBER MmTotalSystemDriverPages;
00583 extern PVOID MiSessionImageStart;
00584 extern PVOID MiSessionImageEnd;
00585 extern PMMPTE MiHighestUserPte;
00586 extern PMMPDE MiHighestUserPde;
00587 extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT];
00588 extern PMMPTE MmSharedUserDataPte;
00589 extern LIST_ENTRY MmProcessList;
00590 extern BOOLEAN MmZeroingPageThreadActive;
00591 extern KEVENT MmZeroingPageEvent;
00592 extern ULONG MmSystemPageColor;
00593 extern ULONG MmProcessColorSeed;
00594 extern PMMWSL MmWorkingSetList;
00595 extern PFN_NUMBER MiNumberOfFreePages;
00596 extern SIZE_T MmSessionViewSize;
00597 extern SIZE_T MmSessionPoolSize;
00598 extern SIZE_T MmSessionImageSize;
00599 extern PVOID MiSystemViewStart;
00600 extern PVOID MiSessionPoolEnd;     // 0xBE000000
00601 extern PVOID MiSessionPoolStart;   // 0xBD000000
00602 extern PVOID MiSessionViewStart;   // 0xBE000000
00603 extern ULONG MmMaximumDeadKernelStacks;
00604 extern SLIST_HEADER MmDeadStackSListHead;
00605 extern MM_AVL_TABLE MmSectionBasedRoot;
00606 extern KGUARDED_MUTEX MmSectionBasedMutex;
00607 extern PVOID MmHighSectionBase;
00608 
00609 BOOLEAN
00610 FORCEINLINE
00611 MiIsMemoryTypeFree(TYPE_OF_MEMORY MemoryType)
00612 {
00613     return ((MemoryType == LoaderFree) ||
00614             (MemoryType == LoaderLoadedProgram) ||
00615             (MemoryType == LoaderFirmwareTemporary) ||
00616             (MemoryType == LoaderOsloaderStack));
00617 }
00618 
00619 BOOLEAN
00620 FORCEINLINE
00621 MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType)
00622 {
00623     return ((MemoryType == LoaderFirmwarePermanent) ||
00624             (MemoryType == LoaderSpecialMemory) ||
00625             (MemoryType == LoaderHALCachedMemory) ||
00626             (MemoryType == LoaderBBTMemory));
00627 }
00628 
00629 #ifdef _M_AMD64
00630 BOOLEAN
00631 FORCEINLINE
00632 MiIsUserPxe(PVOID Address)
00633 {
00634     return ((ULONG_PTR)Address >> 7) == 0x1FFFFEDF6FB7DA0ULL;
00635 }
00636 
00637 BOOLEAN
00638 FORCEINLINE
00639 MiIsUserPpe(PVOID Address)
00640 {
00641     return ((ULONG_PTR)Address >> 16) == 0xFFFFF6FB7DA0ULL;
00642 }
00643 
00644 BOOLEAN
00645 FORCEINLINE
00646 MiIsUserPde(PVOID Address)
00647 {
00648     return ((ULONG_PTR)Address >> 25) == 0x7FFFFB7DA0ULL;
00649 }
00650 
00651 BOOLEAN
00652 FORCEINLINE
00653 MiIsUserPte(PVOID Address)
00654 {
00655     return ((ULONG_PTR)Address >> 34) == 0x3FFFFDA0ULL;
00656 }
00657 #else
00658 BOOLEAN
00659 FORCEINLINE
00660 MiIsUserPde(PVOID Address)
00661 {
00662     return ((Address >= (PVOID)MiAddressToPde(NULL)) &&
00663             (Address <= (PVOID)MiHighestUserPde));
00664 }
00665 
00666 BOOLEAN
00667 FORCEINLINE
00668 MiIsUserPte(PVOID Address)
00669 {
00670     return (Address <= (PVOID)MiHighestUserPte);
00671 }
00672 #endif
00673 
00674 //
00675 // Figures out the hardware bits for a PTE
00676 //
00677 ULONG_PTR
00678 FORCEINLINE
00679 MiDetermineUserGlobalPteMask(IN PVOID PointerPte)
00680 {
00681     MMPTE TempPte;
00682 
00683     /* Start fresh */
00684     TempPte.u.Long = 0;
00685 
00686     /* Make it valid and accessed */
00687     TempPte.u.Hard.Valid = TRUE;
00688     MI_MAKE_ACCESSED_PAGE(&TempPte);
00689 
00690     /* Is this for user-mode? */
00691     if (
00692 #if (_MI_PAGING_LEVELS == 4)
00693         MiIsUserPxe(PointerPte) ||
00694 #endif
00695 #if (_MI_PAGING_LEVELS >= 3)
00696         MiIsUserPpe(PointerPte) ||
00697 #endif
00698         MiIsUserPde(PointerPte) ||
00699         MiIsUserPte(PointerPte))
00700     {
00701         /* Set the owner bit */
00702         MI_MAKE_OWNER_PAGE(&TempPte);
00703     }
00704 
00705     /* FIXME: We should also set the global bit */
00706 
00707     /* Return the protection */
00708     return TempPte.u.Long;
00709 }
00710 
00711 //
00712 // Creates a valid kernel PTE with the given protection
00713 //
00714 FORCEINLINE
00715 VOID
00716 MI_MAKE_HARDWARE_PTE_KERNEL(IN PMMPTE NewPte,
00717                             IN PMMPTE MappingPte,
00718                             IN ULONG_PTR ProtectionMask,
00719                             IN PFN_NUMBER PageFrameNumber)
00720 {
00721     /* Only valid for kernel, non-session PTEs */
00722     ASSERT(MappingPte > MiHighestUserPte);
00723     ASSERT(!MI_IS_SESSION_PTE(MappingPte));
00724     ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP));
00725 
00726     /* Start fresh */
00727     *NewPte = ValidKernelPte;
00728 
00729     /* Set the protection and page */
00730     NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
00731     NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
00732 }
00733 
00734 //
00735 // Creates a valid PTE with the given protection
00736 //
00737 FORCEINLINE
00738 VOID
00739 MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte,
00740                      IN PMMPTE MappingPte,
00741                      IN ULONG_PTR ProtectionMask,
00742                      IN PFN_NUMBER PageFrameNumber)
00743 {
00744     /* Set the protection and page */
00745     NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte);
00746     NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
00747     NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
00748 }
00749 
00750 //
00751 // Creates a valid user PTE with the given protection
00752 //
00753 FORCEINLINE
00754 VOID
00755 MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte,
00756                           IN PMMPTE MappingPte,
00757                           IN ULONG_PTR ProtectionMask,
00758                           IN PFN_NUMBER PageFrameNumber)
00759 {
00760     /* Only valid for kernel, non-session PTEs */
00761     ASSERT(MappingPte <= MiHighestUserPte);
00762 
00763     /* Start fresh */
00764     *NewPte = ValidKernelPte;
00765 
00766     /* Set the protection and page */
00767     NewPte->u.Hard.Owner = TRUE;
00768     NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
00769     NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
00770 }
00771 
00772 #ifndef _M_AMD64
00773 //
00774 // Builds a Prototype PTE for the address of the PTE
00775 //
00776 FORCEINLINE
00777 VOID
00778 MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte,
00779                       IN PMMPTE PointerPte)
00780 {
00781     ULONG_PTR Offset;
00782 
00783     /* Mark this as a prototype */
00784     NewPte->u.Long = 0;
00785     NewPte->u.Proto.Prototype = 1;
00786 
00787     /*
00788      * Prototype PTEs are only valid in paged pool by design, this little trick
00789      * lets us only use 28 bits for the adress of the PTE
00790      */
00791     Offset = (ULONG_PTR)PointerPte - (ULONG_PTR)MmPagedPoolStart;
00792 
00793     /* 7 bits go in the "low", and the other 21 bits go in the "high" */
00794     NewPte->u.Proto.ProtoAddressLow = Offset & 0x7F;
00795     NewPte->u.Proto.ProtoAddressHigh = (Offset & 0xFFFFFF80) >> 7;
00796     ASSERT(MiProtoPteToPte(NewPte) == PointerPte);
00797 }
00798 #endif
00799 
00800 //
00801 // Returns if the page is physically resident (ie: a large page)
00802 // FIXFIX: CISC/x86 only?
00803 //
00804 FORCEINLINE
00805 BOOLEAN
00806 MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
00807 {
00808     PMMPDE PointerPde;
00809 
00810     /* Large pages are never paged out, always physically resident */
00811     PointerPde = MiAddressToPde(Address);
00812     return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid));
00813 }
00814 
00815 //
00816 // Writes a valid PTE
00817 //
00818 VOID
00819 FORCEINLINE
00820 MI_WRITE_VALID_PTE(IN PMMPTE PointerPte,
00821                    IN MMPTE TempPte)
00822 {
00823     /* Write the valid PTE */
00824     ASSERT(PointerPte->u.Hard.Valid == 0);
00825     ASSERT(TempPte.u.Hard.Valid == 1);
00826     *PointerPte = TempPte;
00827 }
00828 
00829 //
00830 // Writes an invalid PTE
00831 //
00832 VOID
00833 FORCEINLINE
00834 MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte,
00835                      IN MMPTE InvalidPte)
00836 {
00837     /* Write the invalid PTE */
00838     ASSERT(InvalidPte.u.Hard.Valid == 0);
00839     *PointerPte = InvalidPte;
00840 }
00841 
00842 //
00843 // Writes a valid PDE
00844 //
00845 VOID
00846 FORCEINLINE
00847 MI_WRITE_VALID_PDE(IN PMMPDE PointerPde,
00848                    IN MMPDE TempPde)
00849 {
00850     /* Write the valid PDE */
00851     ASSERT(PointerPde->u.Hard.Valid == 0);
00852     ASSERT(TempPde.u.Hard.Valid == 1);
00853     *PointerPde = TempPde;
00854 }
00855 
00856 //
00857 // Writes an invalid PDE
00858 //
00859 VOID
00860 FORCEINLINE
00861 MI_WRITE_INVALID_PDE(IN PMMPDE PointerPde,
00862                      IN MMPDE InvalidPde)
00863 {
00864     /* Write the invalid PDE */
00865     ASSERT(InvalidPde.u.Hard.Valid == 0);
00866     *PointerPde = InvalidPde;
00867 }
00868 
00869 //
00870 // Checks if the thread already owns a working set
00871 //
00872 FORCEINLINE
00873 BOOLEAN
00874 MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread)
00875 {
00876     /* If any of these are held, return TRUE */
00877     return ((Thread->OwnsProcessWorkingSetExclusive) ||
00878             (Thread->OwnsProcessWorkingSetShared) ||
00879             (Thread->OwnsSystemWorkingSetExclusive) ||
00880             (Thread->OwnsSystemWorkingSetShared) ||
00881             (Thread->OwnsSessionWorkingSetExclusive) ||
00882             (Thread->OwnsSessionWorkingSetShared));
00883 }
00884 
00885 //
00886 // Checks if the process owns the working set lock
00887 //
00888 FORCEINLINE
00889 BOOLEAN
00890 MI_WS_OWNER(IN PEPROCESS Process)
00891 {
00892     /* Check if this process is the owner, and that the thread owns the WS */
00893     return ((KeGetCurrentThread()->ApcState.Process == &Process->Pcb) &&
00894             ((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) ||
00895              (PsGetCurrentThread()->OwnsProcessWorkingSetShared)));
00896 }
00897 
00898 //
00899 // Locks the working set for the given process
00900 //
00901 FORCEINLINE
00902 VOID
00903 MiLockProcessWorkingSet(IN PEPROCESS Process,
00904                         IN PETHREAD Thread)
00905 {
00906     /* Shouldn't already be owning the process working set */
00907     ASSERT(Thread->OwnsProcessWorkingSetShared == FALSE);
00908     ASSERT(Thread->OwnsProcessWorkingSetExclusive == FALSE);
00909 
00910     /* Block APCs, make sure that still nothing is already held */
00911     KeEnterGuardedRegion();
00912     ASSERT(!MM_ANY_WS_LOCK_HELD(Thread));
00913 
00914     /* FIXME: Actually lock it (we can't because Vm is used by MAREAs) */
00915 
00916     /* FIXME: This also can't be checked because Vm is used by MAREAs) */
00917     //ASSERT(Process->Vm.Flags.AcquiredUnsafe == 0);
00918 
00919     /* Okay, now we can own it exclusively */
00920     Thread->OwnsProcessWorkingSetExclusive = TRUE;
00921 }
00922 
00923 //
00924 // Unlocks the working set for the given process
00925 //
00926 FORCEINLINE
00927 VOID
00928 MiUnlockProcessWorkingSet(IN PEPROCESS Process,
00929                           IN PETHREAD Thread)
00930 {
00931     /* Make sure this process really is owner, and it was a safe acquisition */
00932     ASSERT(MI_WS_OWNER(Process));
00933     /* This can't be checked because Vm is used by MAREAs) */
00934     //ASSERT(Process->Vm.Flags.AcquiredUnsafe == 0);
00935 
00936     /* The thread doesn't own it anymore */
00937     ASSERT(Thread->OwnsProcessWorkingSetExclusive == TRUE);
00938     Thread->OwnsProcessWorkingSetExclusive = FALSE;
00939 
00940     /* FIXME: Actually release it (we can't because Vm is used by MAREAs) */
00941 
00942     /* Unblock APCs */
00943     KeLeaveGuardedRegion();
00944 }
00945 
00946 //
00947 // Locks the working set
00948 //
00949 FORCEINLINE
00950 VOID
00951 MiLockWorkingSet(IN PETHREAD Thread,
00952                  IN PMMSUPPORT WorkingSet)
00953 {
00954     /* Block APCs */
00955     KeEnterGuardedRegion();
00956 
00957     /* Working set should be in global memory */
00958     ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
00959 
00960     /* Thread shouldn't already be owning something */
00961     ASSERT(!MM_ANY_WS_LOCK_HELD(Thread));
00962 
00963     /* FIXME: Actually lock it (we can't because Vm is used by MAREAs) */
00964 
00965     /* Which working set is this? */
00966     if (WorkingSet == &MmSystemCacheWs)
00967     {
00968         /* Own the system working set */
00969         ASSERT((Thread->OwnsSystemWorkingSetExclusive == FALSE) &&
00970                (Thread->OwnsSystemWorkingSetShared == FALSE));
00971         Thread->OwnsSystemWorkingSetExclusive = TRUE;
00972     }
00973     else if (WorkingSet->Flags.SessionSpace)
00974     {
00975         /* We don't implement this yet */
00976         UNIMPLEMENTED;
00977         while (TRUE);
00978     }
00979     else
00980     {
00981         /* Own the process working set */
00982         ASSERT((Thread->OwnsProcessWorkingSetExclusive == FALSE) &&
00983                (Thread->OwnsProcessWorkingSetShared == FALSE));
00984         Thread->OwnsProcessWorkingSetExclusive = TRUE;
00985     }
00986 }
00987 
00988 //
00989 // Unlocks the working set
00990 //
00991 FORCEINLINE
00992 VOID
00993 MiUnlockWorkingSet(IN PETHREAD Thread,
00994                    IN PMMSUPPORT WorkingSet)
00995 {
00996     /* Working set should be in global memory */
00997     ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
00998 
00999     /* Which working set is this? */
01000     if (WorkingSet == &MmSystemCacheWs)
01001     {
01002         /* Release the system working set */
01003         ASSERT((Thread->OwnsSystemWorkingSetExclusive == TRUE) ||
01004                (Thread->OwnsSystemWorkingSetShared == TRUE));
01005         Thread->OwnsSystemWorkingSetExclusive = FALSE;
01006     }
01007     else if (WorkingSet->Flags.SessionSpace)
01008     {
01009         /* We don't implement this yet */
01010         UNIMPLEMENTED;
01011         while (TRUE);
01012     }
01013     else
01014     {
01015         /* Release the process working set */
01016         ASSERT((Thread->OwnsProcessWorkingSetExclusive) ||
01017                (Thread->OwnsProcessWorkingSetShared));
01018         Thread->OwnsProcessWorkingSetExclusive = FALSE;
01019     }
01020 
01021     /* FIXME: Actually release it (we can't because Vm is used by MAREAs) */
01022 
01023     /* Unblock APCs */
01024     KeLeaveGuardedRegion();
01025 }
01026 
01027 //
01028 // Returns the ProtoPTE inside a VAD for the given VPN
01029 //
01030 FORCEINLINE
01031 PMMPTE
01032 MI_GET_PROTOTYPE_PTE_FOR_VPN(IN PMMVAD Vad,
01033                              IN ULONG_PTR Vpn)
01034 {
01035     PMMPTE ProtoPte;
01036 
01037     /* Find the offset within the VAD's prototype PTEs */
01038     ProtoPte = Vad->FirstPrototypePte + (Vpn - Vad->StartingVpn);
01039     ASSERT(ProtoPte <= Vad->LastContiguousPte);
01040     return ProtoPte;
01041 }
01042 
01043 //
01044 // Returns the PFN Database entry for the given page number
01045 // Warning: This is not necessarily a valid PFN database entry!
01046 //
01047 FORCEINLINE
01048 PMMPFN
01049 MI_PFN_ELEMENT(IN PFN_NUMBER Pfn)
01050 {
01051     /* Get the entry */
01052     return &MmPfnDatabase[Pfn];
01053 };
01054 
01055 BOOLEAN
01056 NTAPI
01057 MmArmInitSystem(
01058     IN ULONG Phase,
01059     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01060 );
01061 
01062 VOID
01063 NTAPI
01064 MiInitializeSessionSpaceLayout();
01065 
01066 NTSTATUS
01067 NTAPI
01068 MiInitMachineDependent(
01069     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01070 );
01071 
01072 VOID
01073 NTAPI
01074 MiComputeColorInformation(
01075     VOID
01076 );
01077 
01078 VOID
01079 NTAPI
01080 MiMapPfnDatabase(
01081     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01082 );
01083 
01084 VOID
01085 NTAPI
01086 MiInitializeColorTables(
01087     VOID
01088 );
01089 
01090 VOID
01091 NTAPI
01092 MiInitializePfnDatabase(
01093     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01094 );
01095 
01096 VOID
01097 NTAPI
01098 MiInitializeSessionIds(
01099     VOID
01100 );
01101 
01102 BOOLEAN
01103 NTAPI
01104 MiInitializeMemoryEvents(
01105     VOID
01106 );
01107 
01108 PFN_NUMBER
01109 NTAPI
01110 MxGetNextPage(
01111     IN PFN_NUMBER PageCount
01112 );
01113 
01114 PPHYSICAL_MEMORY_DESCRIPTOR
01115 NTAPI
01116 MmInitializeMemoryLimits(
01117     IN PLOADER_PARAMETER_BLOCK LoaderBlock,
01118     IN PBOOLEAN IncludeType
01119 );
01120 
01121 PFN_NUMBER
01122 NTAPI
01123 MiPagesInLoaderBlock(
01124     IN PLOADER_PARAMETER_BLOCK LoaderBlock,
01125     IN PBOOLEAN IncludeType
01126 );
01127 
01128 VOID
01129 FASTCALL
01130 MiSyncARM3WithROS(
01131     IN PVOID AddressStart,
01132     IN PVOID AddressEnd
01133 );
01134 
01135 NTSTATUS
01136 NTAPI
01137 MiRosProtectVirtualMemory(
01138     IN PEPROCESS Process,
01139     IN OUT PVOID *BaseAddress,
01140     IN OUT PSIZE_T NumberOfBytesToProtect,
01141     IN ULONG NewAccessProtection,
01142     OUT PULONG OldAccessProtection OPTIONAL
01143 );
01144 
01145 NTSTATUS
01146 NTAPI
01147 MmArmAccessFault(
01148     IN BOOLEAN StoreInstruction,
01149     IN PVOID Address,
01150     IN KPROCESSOR_MODE Mode,
01151     IN PVOID TrapInformation
01152 );
01153 
01154 NTSTATUS
01155 FASTCALL
01156 MiCheckPdeForPagedPool(
01157     IN PVOID Address
01158 );
01159 
01160 VOID
01161 NTAPI
01162 MiInitializeNonPagedPool(
01163     VOID
01164 );
01165 
01166 VOID
01167 NTAPI
01168 MiInitializeNonPagedPoolThresholds(
01169     VOID
01170 );
01171 
01172 VOID
01173 NTAPI
01174 MiInitializePoolEvents(
01175     VOID
01176 );
01177 
01178 VOID                      //
01179 NTAPI                     //
01180 InitializePool(           //
01181     IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
01182     IN ULONG Threshold    //
01183 );                        //
01184 
01185 VOID
01186 NTAPI
01187 MiInitializeSystemPtes(
01188     IN PMMPTE StartingPte,
01189     IN ULONG NumberOfPtes,
01190     IN MMSYSTEM_PTE_POOL_TYPE PoolType
01191 );
01192 
01193 PMMPTE
01194 NTAPI
01195 MiReserveSystemPtes(
01196     IN ULONG NumberOfPtes,
01197     IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
01198 );
01199 
01200 VOID
01201 NTAPI
01202 MiReleaseSystemPtes(
01203     IN PMMPTE StartingPte,
01204     IN ULONG NumberOfPtes,
01205     IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
01206 );
01207 
01208 
01209 PFN_NUMBER
01210 NTAPI
01211 MiFindContiguousPages(
01212     IN PFN_NUMBER LowestPfn,
01213     IN PFN_NUMBER HighestPfn,
01214     IN PFN_NUMBER BoundaryPfn,
01215     IN PFN_NUMBER SizeInPages,
01216     IN MEMORY_CACHING_TYPE CacheType
01217 );
01218 
01219 PVOID
01220 NTAPI
01221 MiCheckForContiguousMemory(
01222     IN PVOID BaseAddress,
01223     IN PFN_NUMBER BaseAddressPages,
01224     IN PFN_NUMBER SizeInPages,
01225     IN PFN_NUMBER LowestPfn,
01226     IN PFN_NUMBER HighestPfn,
01227     IN PFN_NUMBER BoundaryPfn,
01228     IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
01229 );
01230 
01231 PMDL
01232 NTAPI
01233 MiAllocatePagesForMdl(
01234     IN PHYSICAL_ADDRESS LowAddress,
01235     IN PHYSICAL_ADDRESS HighAddress,
01236     IN PHYSICAL_ADDRESS SkipBytes,
01237     IN SIZE_T TotalBytes,
01238     IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
01239     IN ULONG Flags
01240 );
01241 
01242 PVOID
01243 NTAPI
01244 MiMapLockedPagesInUserSpace(
01245     IN PMDL Mdl,
01246     IN PVOID BaseVa,
01247     IN MEMORY_CACHING_TYPE CacheType,
01248     IN PVOID BaseAddress
01249 );
01250 
01251 VOID
01252 NTAPI
01253 MiUnmapLockedPagesInUserSpace(
01254     IN PVOID BaseAddress,
01255     IN PMDL Mdl
01256 );
01257 
01258 VOID
01259 NTAPI
01260 MiInsertPageInList(
01261     IN PMMPFNLIST ListHead,
01262     IN PFN_NUMBER PageFrameIndex
01263 );
01264 
01265 VOID
01266 NTAPI
01267 MiUnlinkFreeOrZeroedPage(
01268     IN PMMPFN Entry
01269 );
01270 
01271 VOID
01272 NTAPI
01273 MiUnlinkPageFromList(
01274     IN PMMPFN Pfn
01275 );
01276 
01277 PFN_NUMBER
01278 NTAPI
01279 MiAllocatePfn(
01280     IN PMMPTE PointerPte,
01281     IN ULONG Protection
01282 );
01283 
01284 VOID
01285 NTAPI
01286 MiInitializePfn(
01287     IN PFN_NUMBER PageFrameIndex,
01288     IN PMMPTE PointerPte,
01289     IN BOOLEAN Modified
01290 );
01291 
01292 VOID
01293 NTAPI
01294 MiInitializePfnAndMakePteValid(
01295     IN PFN_NUMBER PageFrameIndex,
01296     IN PMMPTE PointerPte,
01297     IN MMPTE TempPte
01298 );
01299 
01300 VOID
01301 NTAPI
01302 MiInitializePfnForOtherProcess(
01303     IN PFN_NUMBER PageFrameIndex,
01304     IN PMMPTE PointerPte,
01305     IN PFN_NUMBER PteFrame
01306 );
01307 
01308 VOID
01309 NTAPI
01310 MiDecrementShareCount(
01311     IN PMMPFN Pfn1,
01312     IN PFN_NUMBER PageFrameIndex
01313 );
01314 
01315 VOID
01316 NTAPI
01317 MiDecrementReferenceCount(
01318     IN PMMPFN Pfn1,
01319     IN PFN_NUMBER PageFrameIndex
01320 );
01321 
01322 PFN_NUMBER
01323 NTAPI
01324 MiRemoveAnyPage(
01325     IN ULONG Color
01326 );
01327 
01328 PFN_NUMBER
01329 NTAPI
01330 MiRemoveZeroPage(
01331     IN ULONG Color
01332 );
01333 
01334 VOID
01335 NTAPI
01336 MiZeroPhysicalPage(
01337     IN PFN_NUMBER PageFrameIndex
01338 );
01339 
01340 VOID
01341 NTAPI
01342 MiInsertPageInFreeList(
01343     IN PFN_NUMBER PageFrameIndex
01344 );
01345 
01346 PFN_COUNT
01347 NTAPI
01348 MiDeleteSystemPageableVm(
01349     IN PMMPTE PointerPte,
01350     IN PFN_NUMBER PageCount,
01351     IN ULONG Flags,
01352     OUT PPFN_NUMBER ValidPages
01353 );
01354 
01355 ULONG
01356 NTAPI
01357 MiGetPageProtection(
01358     IN PMMPTE PointerPte
01359 );
01360 
01361 PLDR_DATA_TABLE_ENTRY
01362 NTAPI
01363 MiLookupDataTableEntry(
01364     IN PVOID Address
01365 );
01366 
01367 VOID
01368 NTAPI
01369 MiInitializeDriverLargePageList(
01370     VOID
01371 );
01372 
01373 VOID
01374 NTAPI
01375 MiInitializeLargePageSupport(
01376     VOID
01377 );
01378 
01379 VOID
01380 NTAPI
01381 MiSyncCachedRanges(
01382     VOID
01383 );
01384 
01385 BOOLEAN
01386 NTAPI
01387 MiIsPfnInUse(
01388     IN PMMPFN Pfn1
01389 );
01390 
01391 PMMVAD
01392 NTAPI
01393 MiLocateAddress(
01394     IN PVOID VirtualAddress
01395 );
01396 
01397 PMMADDRESS_NODE
01398 NTAPI
01399 MiCheckForConflictingNode(
01400     IN ULONG_PTR StartVpn,
01401     IN ULONG_PTR EndVpn,
01402     IN PMM_AVL_TABLE Table
01403 );
01404 
01405 TABLE_SEARCH_RESULT
01406 NTAPI
01407 MiFindEmptyAddressRangeDownTree(
01408     IN SIZE_T Length,
01409     IN ULONG_PTR BoundaryAddress,
01410     IN ULONG_PTR Alignment,
01411     IN PMM_AVL_TABLE Table,
01412     OUT PULONG_PTR Base,
01413     OUT PMMADDRESS_NODE *Parent
01414 );
01415 
01416 NTSTATUS
01417 NTAPI
01418 MiFindEmptyAddressRangeDownBasedTree(
01419     IN SIZE_T Length,
01420     IN ULONG_PTR BoundaryAddress,
01421     IN ULONG_PTR Alignment,
01422     IN PMM_AVL_TABLE Table,
01423     OUT PULONG_PTR Base
01424 );
01425 
01426 NTSTATUS
01427 NTAPI
01428 MiFindEmptyAddressRangeInTree(
01429     IN SIZE_T Length,
01430     IN ULONG_PTR Alignment,
01431     IN PMM_AVL_TABLE Table,
01432     OUT PMMADDRESS_NODE *PreviousVad,
01433     OUT PULONG_PTR Base
01434 );
01435 
01436 VOID
01437 NTAPI
01438 MiInsertVad(
01439     IN PMMVAD Vad,
01440     IN PEPROCESS Process
01441 );
01442 
01443 VOID
01444 NTAPI
01445 MiInsertBasedSection(
01446     IN PSECTION Section
01447 );
01448 
01449 NTSTATUS
01450 NTAPI
01451 MiUnmapViewOfSection(
01452     IN PEPROCESS Process,
01453     IN PVOID BaseAddress,
01454     IN ULONG Flags
01455 );
01456 
01457 NTSTATUS
01458 NTAPI
01459 MiRosUnmapViewOfSection(
01460     IN PEPROCESS Process,
01461     IN PVOID BaseAddress,
01462     IN ULONG Flags
01463 );
01464 
01465 VOID
01466 NTAPI
01467 MiInsertNode(
01468     IN PMM_AVL_TABLE Table,
01469     IN PMMADDRESS_NODE NewNode,
01470     PMMADDRESS_NODE Parent,
01471     TABLE_SEARCH_RESULT Result
01472 );
01473 
01474 VOID
01475 NTAPI
01476 MiRemoveNode(
01477     IN PMMADDRESS_NODE Node,
01478     IN PMM_AVL_TABLE Table
01479 );
01480 
01481 PMMADDRESS_NODE
01482 NTAPI
01483 MiGetPreviousNode(
01484     IN PMMADDRESS_NODE Node
01485 );
01486 
01487 PMMADDRESS_NODE
01488 NTAPI
01489 MiGetNextNode(
01490     IN PMMADDRESS_NODE Node
01491 );
01492 
01493 BOOLEAN
01494 NTAPI
01495 MiInitializeSystemSpaceMap(
01496     IN PVOID InputSession OPTIONAL
01497 );
01498 
01499 ULONG
01500 NTAPI
01501 MiMakeProtectionMask(
01502     IN ULONG Protect
01503 );
01504 
01505 VOID
01506 NTAPI
01507 MiDeleteVirtualAddresses(
01508     IN ULONG_PTR Va,
01509     IN ULONG_PTR EndingAddress,
01510     IN PMMVAD Vad
01511 );
01512 
01513 ULONG
01514 NTAPI
01515 MiMakeSystemAddressValid(
01516     IN PVOID PageTableVirtualAddress,
01517     IN PEPROCESS CurrentProcess
01518 );
01519 
01520 ULONG
01521 NTAPI
01522 MiMakeSystemAddressValidPfn(
01523     IN PVOID VirtualAddress,
01524     IN KIRQL OldIrql
01525 );
01526 
01527 VOID
01528 NTAPI
01529 MiRemoveMappedView(
01530     IN PEPROCESS CurrentProcess,
01531     IN PMMVAD Vad
01532 );
01533 
01534 PSUBSECTION
01535 NTAPI
01536 MiLocateSubsection(
01537     IN PMMVAD Vad,
01538     IN ULONG_PTR Vpn
01539 );
01540 
01541 NTSTATUS
01542 NTAPI
01543 MiQueryMemorySectionName(
01544     IN HANDLE ProcessHandle,
01545     IN PVOID BaseAddress,
01546     OUT PVOID MemoryInformation,
01547     IN SIZE_T MemoryInformationLength,
01548     OUT PSIZE_T ReturnLength
01549 );
01550 
01551 NTSTATUS
01552 NTAPI
01553 MiRosAllocateVirtualMemory(
01554     IN HANDLE ProcessHandle,
01555     IN PEPROCESS Process,
01556     IN PMEMORY_AREA MemoryArea,
01557     IN PMMSUPPORT AddressSpace,
01558     IN OUT PVOID* UBaseAddress,
01559     IN BOOLEAN Attached,
01560     IN OUT PSIZE_T URegionSize,
01561     IN ULONG AllocationType,
01562     IN ULONG Protect
01563 );
01564 
01565 NTSTATUS
01566 NTAPI
01567 MiRosUnmapViewInSystemSpace(
01568     IN PVOID MappedBase
01569 );
01570 
01571 POOL_TYPE
01572 NTAPI
01573 MmDeterminePoolType(
01574     IN PVOID PoolAddress
01575 );
01576 
01577 VOID
01578 NTAPI
01579 MiMakePdeExistAndMakeValid(
01580     IN PMMPTE PointerPde,
01581     IN PEPROCESS TargetProcess,
01582     IN KIRQL OldIrql
01583 );
01584 
01585 //
01586 // MiRemoveZeroPage will use inline code to zero out the page manually if only
01587 // free pages are available. In some scenarios, we don't/can't run that piece of
01588 // code and would rather only have a real zero page. If we can't have a zero page,
01589 // then we'd like to have our own code to grab a free page and zero it out, by
01590 // using MiRemoveAnyPage. This macro implements this.
01591 //
01592 PFN_NUMBER
01593 FORCEINLINE
01594 MiRemoveZeroPageSafe(IN ULONG Color)
01595 {
01596     if (MmFreePagesByColor[ZeroedPageList][Color].Flink != LIST_HEAD) return MiRemoveZeroPage(Color);
01597     return 0;
01598 }
01599 
01600 //
01601 // New ARM3<->RosMM PAGE Architecture
01602 //
01603 BOOLEAN
01604 FORCEINLINE
01605 MiIsRosSectionObject(IN PVOID Section)
01606 {
01607     PROS_SECTION_OBJECT RosSection = Section;
01608     if ((RosSection->Type == 'SC') && (RosSection->Size == 'TN')) return TRUE;
01609     return FALSE;
01610 }
01611 
01612 #ifdef _WIN64
01613 // HACK ON TOP OF HACK ALERT!!!
01614 #define MI_GET_ROS_DATA(x) \
01615     (((x)->RosMmData == 0) ? NULL : ((PMMROSPFN)((ULONG64)(ULONG)((x)->RosMmData) | \
01616                                     ((ULONG64)MmNonPagedPoolStart & 0xffffffff00000000ULL))))
01617 #else
01618 #define MI_GET_ROS_DATA(x)   ((PMMROSPFN)(x->RosMmData))
01619 #endif
01620 #define MI_IS_ROS_PFN(x)     (((x)->u4.AweAllocation == TRUE) && (MI_GET_ROS_DATA(x) != NULL))
01621 #define ASSERT_IS_ROS_PFN(x) ASSERT(MI_IS_ROS_PFN(x) == TRUE);
01622 typedef struct _MMROSPFN
01623 {
01624     PMM_RMAP_ENTRY RmapListHead;
01625     SWAPENTRY SwapEntry;
01626 } MMROSPFN, *PMMROSPFN;
01627 
01628 #define RosMmData            AweReferenceCount
01629 
01630 /* EOF */

Generated on Sat May 26 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.