Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmiarm.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
1.7.6.1
|