Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmm.h
Go to the documentation of this file.
00001 #pragma once 00002 00003 #include <internal/arch/mm.h> 00004 00005 /* TYPES *********************************************************************/ 00006 00007 struct _EPROCESS; 00008 00009 extern PMMSUPPORT MmKernelAddressSpace; 00010 extern PFN_COUNT MiFreeSwapPages; 00011 extern PFN_COUNT MiUsedSwapPages; 00012 extern SIZE_T MmTotalPagedPoolQuota; 00013 extern SIZE_T MmTotalNonPagedPoolQuota; 00014 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress; 00015 extern PFN_COUNT MmNumberOfPhysicalPages; 00016 extern UCHAR MmDisablePagingExecutive; 00017 extern PFN_NUMBER MmLowestPhysicalPage; 00018 extern PFN_NUMBER MmHighestPhysicalPage; 00019 extern PFN_NUMBER MmAvailablePages; 00020 extern PFN_NUMBER MmResidentAvailablePages; 00021 00022 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; 00023 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; 00024 00025 extern LIST_ENTRY MmLoadedUserImageList; 00026 00027 extern KMUTANT MmSystemLoadLock; 00028 00029 extern ULONG MmNumberOfPagingFiles; 00030 00031 extern PVOID MmUnloadedDrivers; 00032 extern PVOID MmLastUnloadedDrivers; 00033 extern PVOID MmTriageActionTaken; 00034 extern PVOID KernelVerifier; 00035 extern MM_DRIVER_VERIFIER_DATA MmVerifierData; 00036 00037 extern SIZE_T MmTotalCommitLimit; 00038 extern SIZE_T MmTotalCommittedPages; 00039 extern SIZE_T MmSharedCommit; 00040 extern SIZE_T MmDriverCommit; 00041 extern SIZE_T MmProcessCommit; 00042 extern SIZE_T MmPagedPoolCommit; 00043 extern SIZE_T MmPeakCommitment; 00044 extern SIZE_T MmtotalCommitLimitMaximum; 00045 00046 extern PVOID MiDebugMapping; 00047 extern PMMPTE MmDebugPte; 00048 00049 struct _KTRAP_FRAME; 00050 struct _EPROCESS; 00051 struct _MM_RMAP_ENTRY; 00052 typedef ULONG_PTR SWAPENTRY; 00053 00054 // 00055 // MmDbgCopyMemory Flags 00056 // 00057 #define MMDBG_COPY_WRITE 0x00000001 00058 #define MMDBG_COPY_PHYSICAL 0x00000002 00059 #define MMDBG_COPY_UNSAFE 0x00000004 00060 #define MMDBG_COPY_CACHED 0x00000008 00061 #define MMDBG_COPY_UNCACHED 0x00000010 00062 #define MMDBG_COPY_WRITE_COMBINED 0x00000020 00063 00064 // 00065 // Maximum chunk size per copy 00066 // 00067 #define MMDBG_COPY_MAX_SIZE 0x8 00068 00069 #if defined(_X86_) 00070 #define MI_STATIC_MEMORY_AREAS (14) 00071 #else 00072 #define MI_STATIC_MEMORY_AREAS (13) 00073 #endif 00074 00075 #define MEMORY_AREA_SECTION_VIEW (1) 00076 #define MEMORY_AREA_CACHE (2) 00077 #define MEMORY_AREA_OWNED_BY_ARM3 (15) 00078 #define MEMORY_AREA_STATIC (0x80000000) 00079 00080 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8) 00081 00082 #define MM_CORE_DUMP_TYPE_NONE (0x0) 00083 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1) 00084 #define MM_CORE_DUMP_TYPE_FULL (0x2) 00085 00086 /* Number of list heads to use */ 00087 #define MI_FREE_POOL_LISTS 4 00088 00089 00090 /* Signature of free pool blocks */ 00091 #define MM_FREE_POOL_TAG 'lprF' 00092 00093 /* Although Microsoft says this isn't hardcoded anymore, 00094 they won't be able to change it. Stuff depends on it */ 00095 #define MM_VIRTMEM_GRANULARITY (64 * 1024) 00096 00097 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001) 00098 00099 /* 00100 * Additional flags for protection attributes 00101 */ 00102 #define PAGE_WRITETHROUGH (1024) 00103 #define PAGE_SYSTEM (2048) 00104 00105 #define SEC_PHYSICALMEMORY (0x80000000) 00106 00107 #define MM_PAGEFILE_SEGMENT (0x1) 00108 #define MM_DATAFILE_SEGMENT (0x2) 00109 00110 #define MC_CACHE (0) 00111 #define MC_USER (1) 00112 #define MC_SYSTEM (2) 00113 #define MC_MAXIMUM (3) 00114 00115 #define PAGED_POOL_MASK 1 00116 #define MUST_SUCCEED_POOL_MASK 2 00117 #define CACHE_ALIGNED_POOL_MASK 4 00118 #define QUOTA_POOL_MASK 8 00119 #define SESSION_POOL_MASK 32 00120 #define VERIFIER_POOL_MASK 64 00121 00122 #define MM_PAGED_POOL_SIZE (100*1024*1024) 00123 #define MM_NONPAGED_POOL_SIZE (100*1024*1024) 00124 00125 /* 00126 * Paged and non-paged pools are 8-byte aligned 00127 */ 00128 #define MM_POOL_ALIGNMENT 8 00129 00130 #define MM_ROUND_UP(x,s) \ 00131 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1))) 00132 00133 #define MM_ROUND_DOWN(x,s) \ 00134 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1))) 00135 00136 #define PAGE_FLAGS_VALID_FROM_USER_MODE \ 00137 (PAGE_READONLY | \ 00138 PAGE_READWRITE | \ 00139 PAGE_WRITECOPY | \ 00140 PAGE_EXECUTE | \ 00141 PAGE_EXECUTE_READ | \ 00142 PAGE_EXECUTE_READWRITE | \ 00143 PAGE_EXECUTE_WRITECOPY | \ 00144 PAGE_GUARD | \ 00145 PAGE_NOACCESS | \ 00146 PAGE_NOCACHE) 00147 00148 #define PAGE_FLAGS_VALID_FOR_SECTION \ 00149 (PAGE_READONLY | \ 00150 PAGE_READWRITE | \ 00151 PAGE_WRITECOPY | \ 00152 PAGE_EXECUTE | \ 00153 PAGE_EXECUTE_READ | \ 00154 PAGE_EXECUTE_READWRITE | \ 00155 PAGE_EXECUTE_WRITECOPY | \ 00156 PAGE_NOACCESS) 00157 00158 #define PAGE_IS_READABLE \ 00159 (PAGE_READONLY | \ 00160 PAGE_READWRITE | \ 00161 PAGE_WRITECOPY | \ 00162 PAGE_EXECUTE_READ | \ 00163 PAGE_EXECUTE_READWRITE | \ 00164 PAGE_EXECUTE_WRITECOPY) 00165 00166 #define PAGE_IS_WRITABLE \ 00167 (PAGE_READWRITE | \ 00168 PAGE_WRITECOPY | \ 00169 PAGE_EXECUTE_READWRITE | \ 00170 PAGE_EXECUTE_WRITECOPY) 00171 00172 #define PAGE_IS_EXECUTABLE \ 00173 (PAGE_EXECUTE | \ 00174 PAGE_EXECUTE_READ | \ 00175 PAGE_EXECUTE_READWRITE | \ 00176 PAGE_EXECUTE_WRITECOPY) 00177 00178 #define PAGE_IS_WRITECOPY \ 00179 (PAGE_WRITECOPY | \ 00180 PAGE_EXECUTE_WRITECOPY) 00181 00182 00183 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \ 00184 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand) 00185 00186 #define InterlockedExchangePte(PointerPte, Value) \ 00187 InterlockedExchange((PLONG)(PointerPte), Value) 00188 00189 typedef struct _MM_SECTION_SEGMENT 00190 { 00191 FAST_MUTEX Lock; /* lock which protects the page directory */ 00192 PFILE_OBJECT FileObject; 00193 LARGE_INTEGER RawLength; /* length of the segment which is part of the mapped file */ 00194 LARGE_INTEGER Length; /* absolute length of the segment */ 00195 ULONG ReferenceCount; 00196 ULONG CacheCount; 00197 ULONG Protection; 00198 ULONG Flags; 00199 BOOLEAN WriteCopy; 00200 BOOLEAN Locked; 00201 00202 struct 00203 { 00204 ULONGLONG FileOffset; /* start offset into the file for image sections */ 00205 ULONG_PTR VirtualAddress; /* start offset into the address range for image sections */ 00206 ULONG Characteristics; 00207 } Image; 00208 00209 LIST_ENTRY ListOfSegments; 00210 RTL_GENERIC_TABLE PageTable; 00211 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT; 00212 00213 typedef struct _MM_IMAGE_SECTION_OBJECT 00214 { 00215 ULONG_PTR ImageBase; 00216 ULONG_PTR StackReserve; 00217 ULONG_PTR StackCommit; 00218 ULONG_PTR EntryPoint; 00219 USHORT Subsystem; 00220 USHORT ImageCharacteristics; 00221 USHORT MinorSubsystemVersion; 00222 USHORT MajorSubsystemVersion; 00223 USHORT Machine; 00224 BOOLEAN Executable; 00225 ULONG NrSegments; 00226 ULONG ImageSize; 00227 PMM_SECTION_SEGMENT Segments; 00228 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT; 00229 00230 typedef struct _ROS_SECTION_OBJECT 00231 { 00232 CSHORT Type; 00233 CSHORT Size; 00234 LARGE_INTEGER MaximumSize; 00235 ULONG SectionPageProtection; 00236 ULONG AllocationAttributes; 00237 PFILE_OBJECT FileObject; 00238 union 00239 { 00240 PMM_IMAGE_SECTION_OBJECT ImageSection; 00241 PMM_SECTION_SEGMENT Segment; 00242 }; 00243 } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT; 00244 00245 typedef struct _MEMORY_AREA 00246 { 00247 PVOID StartingAddress; 00248 PVOID EndingAddress; 00249 struct _MEMORY_AREA *Parent; 00250 struct _MEMORY_AREA *LeftChild; 00251 struct _MEMORY_AREA *RightChild; 00252 ULONG Type; 00253 ULONG Protect; 00254 ULONG Flags; 00255 BOOLEAN DeleteInProgress; 00256 ULONG PageOpCount; 00257 PVOID Vad; 00258 union 00259 { 00260 struct 00261 { 00262 ROS_SECTION_OBJECT* Section; 00263 LARGE_INTEGER ViewOffset; 00264 PMM_SECTION_SEGMENT Segment; 00265 LIST_ENTRY RegionListHead; 00266 } SectionData; 00267 struct 00268 { 00269 LIST_ENTRY RegionListHead; 00270 } VirtualMemoryData; 00271 } Data; 00272 } MEMORY_AREA, *PMEMORY_AREA; 00273 00274 typedef struct _MM_RMAP_ENTRY 00275 { 00276 struct _MM_RMAP_ENTRY* Next; 00277 PEPROCESS Process; 00278 PVOID Address; 00279 #if DBG 00280 PVOID Caller; 00281 #endif 00282 } 00283 MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; 00284 00285 #if MI_TRACE_PFNS 00286 extern ULONG MI_PFN_CURRENT_USAGE; 00287 extern CHAR MI_PFN_CURRENT_PROCESS_NAME[16]; 00288 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x 00289 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16) 00290 #else 00291 #define MI_SET_USAGE(x) 00292 #define MI_SET_PROCESS2(x) 00293 #endif 00294 00295 typedef enum _MI_PFN_USAGES 00296 { 00297 MI_USAGE_NOT_SET = 0, 00298 MI_USAGE_PAGED_POOL, 00299 MI_USAGE_NONPAGED_POOL, 00300 MI_USAGE_NONPAGED_POOL_EXPANSION, 00301 MI_USAGE_KERNEL_STACK, 00302 MI_USAGE_KERNEL_STACK_EXPANSION, 00303 MI_USAGE_SYSTEM_PTE, 00304 MI_USAGE_VAD, 00305 MI_USAGE_PEB_TEB, 00306 MI_USAGE_SECTION, 00307 MI_USAGE_PAGE_TABLE, 00308 MI_USAGE_PAGE_DIRECTORY, 00309 MI_USAGE_LEGACY_PAGE_DIRECTORY, 00310 MI_USAGE_DRIVER_PAGE, 00311 MI_USAGE_CONTINOUS_ALLOCATION, 00312 MI_USAGE_MDL, 00313 MI_USAGE_DEMAND_ZERO, 00314 MI_USAGE_ZERO_LOOP, 00315 MI_USAGE_CACHE, 00316 MI_USAGE_PFN_DATABASE, 00317 MI_USAGE_BOOT_DRIVER, 00318 MI_USAGE_INIT_MEMORY, 00319 MI_USAGE_FREE_PAGE 00320 } MI_PFN_USAGES; 00321 00322 // 00323 // These two mappings are actually used by Windows itself, based on the ASSERTS 00324 // 00325 #define StartOfAllocation ReadInProgress 00326 #define EndOfAllocation WriteInProgress 00327 00328 typedef struct _MMPFNENTRY 00329 { 00330 USHORT Modified:1; 00331 USHORT ReadInProgress:1; // StartOfAllocation 00332 USHORT WriteInProgress:1; // EndOfAllocation 00333 USHORT PrototypePte:1; 00334 USHORT PageColor:4; 00335 USHORT PageLocation:3; 00336 USHORT RemovalRequested:1; 00337 USHORT CacheAttribute:2; 00338 USHORT Rom:1; 00339 USHORT ParityError:1; // HasRmap 00340 } MMPFNENTRY; 00341 00342 typedef struct _MMPFN 00343 { 00344 union 00345 { 00346 PFN_NUMBER Flink; 00347 ULONG WsIndex; // SavedSwapEntry 00348 PKEVENT Event; 00349 NTSTATUS ReadStatus; 00350 SINGLE_LIST_ENTRY NextStackPfn; 00351 } u1; 00352 PMMPTE PteAddress; 00353 union 00354 { 00355 PFN_NUMBER Blink; 00356 ULONG_PTR ShareCount; 00357 } u2; 00358 union 00359 { 00360 struct 00361 { 00362 USHORT ReferenceCount; // ReferenceCount 00363 MMPFNENTRY e1; 00364 }; 00365 struct 00366 { 00367 USHORT ReferenceCount; 00368 USHORT ShortFlags; 00369 } e2; 00370 } u3; 00371 union 00372 { 00373 MMPTE OriginalPte; 00374 LONG AweReferenceCount; // RmapListHead 00375 }; 00376 union 00377 { 00378 ULONG_PTR EntireFrame; 00379 struct 00380 { 00381 ULONG_PTR PteFrame:25; 00382 ULONG_PTR InPageError:1; 00383 ULONG_PTR VerifierAllocation:1; 00384 ULONG_PTR AweAllocation:1; 00385 ULONG_PTR Priority:3; 00386 ULONG_PTR MustBeCached:1; 00387 }; 00388 } u4; 00389 #if MI_TRACE_PFNS 00390 MI_PFN_USAGES PfnUsage; 00391 CHAR ProcessName[16]; 00392 #endif 00393 } MMPFN, *PMMPFN; 00394 00395 extern PMMPFN MmPfnDatabase; 00396 00397 typedef struct _MMPFNLIST 00398 { 00399 PFN_NUMBER Total; 00400 MMLISTS ListName; 00401 PFN_NUMBER Flink; 00402 PFN_NUMBER Blink; 00403 } MMPFNLIST, *PMMPFNLIST; 00404 00405 extern MMPFNLIST MmZeroedPageListHead; 00406 extern MMPFNLIST MmFreePageListHead; 00407 extern MMPFNLIST MmStandbyPageListHead; 00408 extern MMPFNLIST MmModifiedPageListHead; 00409 extern MMPFNLIST MmModifiedNoWritePageListHead; 00410 00411 typedef struct _MM_MEMORY_CONSUMER 00412 { 00413 ULONG PagesUsed; 00414 ULONG PagesTarget; 00415 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); 00416 } MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; 00417 00418 typedef struct _MM_REGION 00419 { 00420 ULONG Type; 00421 ULONG Protect; 00422 SIZE_T Length; 00423 LIST_ENTRY RegionListEntry; 00424 } MM_REGION, *PMM_REGION; 00425 00426 /* Entry describing free pool memory */ 00427 typedef struct _MMFREE_POOL_ENTRY 00428 { 00429 LIST_ENTRY List; 00430 PFN_COUNT Size; 00431 ULONG Signature; 00432 struct _MMFREE_POOL_ENTRY *Owner; 00433 } MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY; 00434 00435 /* Signature of a freed block */ 00436 #define MM_FREE_POOL_SIGNATURE 'ARM3' 00437 00438 /* Paged pool information */ 00439 typedef struct _MM_PAGED_POOL_INFO 00440 { 00441 PRTL_BITMAP PagedPoolAllocationMap; 00442 PRTL_BITMAP EndOfPagedPoolBitmap; 00443 PMMPTE FirstPteForPagedPool; 00444 PMMPTE LastPteForPagedPool; 00445 PMMPDE NextPdeForPagedPoolExpansion; 00446 ULONG PagedPoolHint; 00447 SIZE_T PagedPoolCommit; 00448 SIZE_T AllocatedPagedPool; 00449 } MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO; 00450 00451 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; 00452 00453 typedef VOID 00454 (*PMM_ALTER_REGION_FUNC)( 00455 PMMSUPPORT AddressSpace, 00456 PVOID BaseAddress, 00457 SIZE_T Length, 00458 ULONG OldType, 00459 ULONG OldProtect, 00460 ULONG NewType, 00461 ULONG NewProtect 00462 ); 00463 00464 typedef VOID 00465 (*PMM_FREE_PAGE_FUNC)( 00466 PVOID Context, 00467 PMEMORY_AREA MemoryArea, 00468 PVOID Address, 00469 PFN_NUMBER Page, 00470 SWAPENTRY SwapEntry, 00471 BOOLEAN Dirty 00472 ); 00473 00474 // 00475 // Mm copy support for Kd 00476 // 00477 NTSTATUS 00478 NTAPI 00479 MmDbgCopyMemory( 00480 IN ULONG64 Address, 00481 IN PVOID Buffer, 00482 IN ULONG Size, 00483 IN ULONG Flags 00484 ); 00485 00486 // 00487 // Determines if a given address is a session address 00488 // 00489 BOOLEAN 00490 NTAPI 00491 MmIsSessionAddress( 00492 IN PVOID Address 00493 ); 00494 00495 /* marea.c *******************************************************************/ 00496 00497 NTSTATUS 00498 NTAPI 00499 MmCreateMemoryArea( 00500 PMMSUPPORT AddressSpace, 00501 ULONG Type, 00502 PVOID *BaseAddress, 00503 SIZE_T Length, 00504 ULONG Protection, 00505 PMEMORY_AREA *Result, 00506 BOOLEAN FixedAddress, 00507 ULONG AllocationFlags, 00508 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL 00509 ); 00510 00511 PMEMORY_AREA 00512 NTAPI 00513 MmLocateMemoryAreaByAddress( 00514 PMMSUPPORT AddressSpace, 00515 PVOID Address 00516 ); 00517 00518 ULONG_PTR 00519 NTAPI 00520 MmFindGapAtAddress( 00521 PMMSUPPORT AddressSpace, 00522 PVOID Address 00523 ); 00524 00525 NTSTATUS 00526 NTAPI 00527 MmFreeMemoryArea( 00528 PMMSUPPORT AddressSpace, 00529 PMEMORY_AREA MemoryArea, 00530 PMM_FREE_PAGE_FUNC FreePage, 00531 PVOID FreePageContext 00532 ); 00533 00534 NTSTATUS 00535 NTAPI 00536 MmFreeMemoryAreaByPtr( 00537 PMMSUPPORT AddressSpace, 00538 PVOID BaseAddress, 00539 PMM_FREE_PAGE_FUNC FreePage, 00540 PVOID FreePageContext 00541 ); 00542 00543 VOID 00544 NTAPI 00545 MmDumpMemoryAreas(PMMSUPPORT AddressSpace); 00546 00547 PMEMORY_AREA 00548 NTAPI 00549 MmLocateMemoryAreaByRegion( 00550 PMMSUPPORT AddressSpace, 00551 PVOID Address, 00552 SIZE_T Length 00553 ); 00554 00555 PVOID 00556 NTAPI 00557 MmFindGap( 00558 PMMSUPPORT AddressSpace, 00559 SIZE_T Length, 00560 ULONG_PTR Granularity, 00561 BOOLEAN TopDown 00562 ); 00563 00564 VOID 00565 NTAPI 00566 MmReleaseMemoryAreaIfDecommitted( 00567 struct _EPROCESS *Process, 00568 PMMSUPPORT AddressSpace, 00569 PVOID BaseAddress 00570 ); 00571 00572 VOID 00573 NTAPI 00574 MmMapMemoryArea(PVOID BaseAddress, 00575 SIZE_T Length, 00576 ULONG Consumer, 00577 ULONG Protection); 00578 00579 /* npool.c *******************************************************************/ 00580 00581 VOID 00582 NTAPI 00583 MiDebugDumpNonPagedPool(BOOLEAN NewOnly); 00584 00585 VOID 00586 NTAPI 00587 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly); 00588 00589 VOID 00590 NTAPI 00591 MiInitializeNonPagedPool(VOID); 00592 00593 PVOID 00594 NTAPI 00595 MiAllocatePoolPages( 00596 IN POOL_TYPE PoolType, 00597 IN SIZE_T SizeInBytes 00598 ); 00599 00600 POOL_TYPE 00601 NTAPI 00602 MmDeterminePoolType( 00603 IN PVOID VirtualAddress 00604 ); 00605 00606 ULONG 00607 NTAPI 00608 MiFreePoolPages( 00609 IN PVOID StartingAddress 00610 ); 00611 00612 PVOID 00613 NTAPI 00614 MmGetMdlPageAddress( 00615 PMDL Mdl, 00616 PVOID Offset 00617 ); 00618 00619 /* pool.c *******************************************************************/ 00620 00621 PVOID 00622 NTAPI 00623 ExAllocateNonPagedPoolWithTag( 00624 POOL_TYPE type, 00625 ULONG size, 00626 ULONG Tag, 00627 PVOID Caller 00628 ); 00629 00630 PVOID 00631 NTAPI 00632 ExAllocatePagedPoolWithTag( 00633 POOL_TYPE Type, 00634 ULONG size, 00635 ULONG Tag 00636 ); 00637 00638 VOID 00639 NTAPI 00640 ExFreeNonPagedPool(PVOID block); 00641 00642 VOID 00643 NTAPI 00644 ExFreePagedPool(IN PVOID Block); 00645 00646 BOOLEAN 00647 NTAPI 00648 ExpIsPoolTagDebuggable(ULONG Tag); 00649 00650 PVOID 00651 NTAPI 00652 ExpAllocateDebugPool( 00653 POOL_TYPE Type, 00654 ULONG Size, 00655 ULONG Tag, 00656 PVOID Caller, 00657 BOOLEAN EndOfPage 00658 ); 00659 00660 VOID 00661 NTAPI 00662 ExpFreeDebugPool(PVOID Block, BOOLEAN PagedPool); 00663 00664 VOID 00665 NTAPI 00666 MmInitializePagedPool(VOID); 00667 00668 PVOID 00669 NTAPI 00670 MiAllocateSpecialPool( 00671 IN POOL_TYPE PoolType, 00672 IN SIZE_T NumberOfBytes, 00673 IN ULONG Tag, 00674 IN ULONG Underrun 00675 ); 00676 00677 BOOLEAN 00678 NTAPI 00679 MiRaisePoolQuota( 00680 IN POOL_TYPE PoolType, 00681 IN ULONG CurrentMaxQuota, 00682 OUT PULONG NewMaxQuota 00683 ); 00684 00685 /* mdl.c *********************************************************************/ 00686 00687 VOID 00688 NTAPI 00689 MmBuildMdlFromPages( 00690 PMDL Mdl, 00691 PPFN_NUMBER Pages 00692 ); 00693 00694 /* mminit.c ******************************************************************/ 00695 00696 VOID 00697 NTAPI 00698 MiShutdownMemoryManager(VOID); 00699 00700 VOID 00701 NTAPI 00702 MmInit1( 00703 VOID 00704 ); 00705 00706 BOOLEAN 00707 NTAPI 00708 MmInitSystem(IN ULONG Phase, 00709 IN PLOADER_PARAMETER_BLOCK LoaderBlock); 00710 00711 VOID 00712 NTAPI 00713 MiFreeInitMemory(VOID); 00714 00715 VOID 00716 NTAPI 00717 MmInitializeMdlImplementation(VOID); 00718 00719 /* pagefile.c ****************************************************************/ 00720 00721 SWAPENTRY 00722 NTAPI 00723 MmAllocSwapPage(VOID); 00724 00725 VOID 00726 NTAPI 00727 MmDereserveSwapPages(ULONG Nr); 00728 00729 VOID 00730 NTAPI 00731 MmFreeSwapPage(SWAPENTRY Entry); 00732 00733 VOID 00734 NTAPI 00735 MmInitPagingFile(VOID); 00736 00737 BOOLEAN 00738 NTAPI 00739 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject); 00740 00741 NTSTATUS 00742 NTAPI 00743 MmReadFromSwapPage( 00744 SWAPENTRY SwapEntry, 00745 PFN_NUMBER Page 00746 ); 00747 00748 BOOLEAN 00749 NTAPI 00750 MmReserveSwapPages(ULONG Nr); 00751 00752 NTSTATUS 00753 NTAPI 00754 MmWriteToSwapPage( 00755 SWAPENTRY SwapEntry, 00756 PFN_NUMBER Page 00757 ); 00758 00759 NTSTATUS 00760 NTAPI 00761 MmDumpToPagingFile( 00762 ULONG BugCode, 00763 ULONG BugCodeParameter1, 00764 ULONG BugCodeParameter2, 00765 ULONG BugCodeParameter3, 00766 ULONG BugCodeParameter4, 00767 struct _KTRAP_FRAME* TrapFrame 00768 ); 00769 00770 BOOLEAN 00771 NTAPI 00772 MmIsAvailableSwapPage(VOID); 00773 00774 VOID 00775 NTAPI 00776 MmShowOutOfSpaceMessagePagingFile(VOID); 00777 00778 /* process.c ****************************************************************/ 00779 00780 NTSTATUS 00781 NTAPI 00782 MmInitializeProcessAddressSpace( 00783 IN PEPROCESS Process, 00784 IN PEPROCESS Clone OPTIONAL, 00785 IN PVOID Section OPTIONAL, 00786 IN OUT PULONG Flags, 00787 IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL 00788 ); 00789 00790 NTSTATUS 00791 NTAPI 00792 MmCreatePeb( 00793 IN PEPROCESS Process, 00794 IN PINITIAL_PEB InitialPeb, 00795 OUT PPEB *BasePeb 00796 ); 00797 00798 NTSTATUS 00799 NTAPI 00800 MmCreateTeb( 00801 IN PEPROCESS Process, 00802 IN PCLIENT_ID ClientId, 00803 IN PINITIAL_TEB InitialTeb, 00804 OUT PTEB* BaseTeb 00805 ); 00806 00807 VOID 00808 NTAPI 00809 MmDeleteTeb( 00810 struct _EPROCESS *Process, 00811 PTEB Teb 00812 ); 00813 00814 VOID 00815 NTAPI 00816 MmCleanProcessAddressSpace(IN PEPROCESS Process); 00817 00818 NTSTATUS 00819 NTAPI 00820 MmDeleteProcessAddressSpace(IN PEPROCESS Process); 00821 00822 ULONG 00823 NTAPI 00824 MmGetSessionLocaleId(VOID); 00825 00826 NTSTATUS 00827 NTAPI 00828 MmSetMemoryPriorityProcess( 00829 IN PEPROCESS Process, 00830 IN UCHAR MemoryPriority 00831 ); 00832 00833 /* i386/pfault.c *************************************************************/ 00834 00835 NTSTATUS 00836 NTAPI 00837 MmPageFault( 00838 ULONG Cs, 00839 PULONG Eip, 00840 PULONG Eax, 00841 ULONG Cr2, 00842 ULONG ErrorCode 00843 ); 00844 00845 /* special.c *****************************************************************/ 00846 00847 VOID 00848 NTAPI 00849 MiInitializeSpecialPool(); 00850 00851 BOOLEAN 00852 NTAPI 00853 MmUseSpecialPool( 00854 IN SIZE_T NumberOfBytes, 00855 IN ULONG Tag); 00856 00857 BOOLEAN 00858 NTAPI 00859 MmIsSpecialPoolAddress( 00860 IN PVOID P); 00861 00862 PVOID 00863 NTAPI 00864 MmAllocateSpecialPool( 00865 IN SIZE_T NumberOfBytes, 00866 IN ULONG Tag, 00867 IN POOL_TYPE PoolType, 00868 IN ULONG SpecialType); 00869 00870 VOID 00871 NTAPI 00872 MmFreeSpecialPool( 00873 IN PVOID P); 00874 00875 /* mm.c **********************************************************************/ 00876 00877 NTSTATUS 00878 NTAPI 00879 MmAccessFault( 00880 IN BOOLEAN StoreInstruction, 00881 IN PVOID Address, 00882 IN KPROCESSOR_MODE Mode, 00883 IN PVOID TrapInformation 00884 ); 00885 00886 /* anonmem.c *****************************************************************/ 00887 00888 NTSTATUS 00889 NTAPI 00890 MmNotPresentFaultVirtualMemory( 00891 PMMSUPPORT AddressSpace, 00892 MEMORY_AREA* MemoryArea, 00893 PVOID Address 00894 ); 00895 00896 NTSTATUS 00897 NTAPI 00898 MmPageOutVirtualMemory( 00899 PMMSUPPORT AddressSpace, 00900 PMEMORY_AREA MemoryArea, 00901 PVOID Address, 00902 PFN_NUMBER Page 00903 ); 00904 00905 NTSTATUS 00906 NTAPI 00907 MmQueryAnonMem( 00908 PMEMORY_AREA MemoryArea, 00909 PVOID Address, 00910 PMEMORY_BASIC_INFORMATION Info, 00911 PSIZE_T ResultLength 00912 ); 00913 00914 VOID 00915 NTAPI 00916 MmFreeVirtualMemory( 00917 struct _EPROCESS* Process, 00918 PMEMORY_AREA MemoryArea 00919 ); 00920 00921 NTSTATUS 00922 NTAPI 00923 MmProtectAnonMem( 00924 PMMSUPPORT AddressSpace, 00925 PMEMORY_AREA MemoryArea, 00926 PVOID BaseAddress, 00927 SIZE_T Length, 00928 ULONG Protect, 00929 PULONG OldProtect 00930 ); 00931 00932 NTSTATUS 00933 NTAPI 00934 MmWritePageVirtualMemory( 00935 PMMSUPPORT AddressSpace, 00936 PMEMORY_AREA MArea, 00937 PVOID Address, 00938 PFN_NUMBER Page 00939 ); 00940 00941 /* kmap.c ********************************************************************/ 00942 00943 PVOID 00944 NTAPI 00945 ExAllocatePage(VOID); 00946 00947 VOID 00948 NTAPI 00949 ExUnmapPage(PVOID Addr); 00950 00951 PVOID 00952 NTAPI 00953 ExAllocatePageWithPhysPage(PFN_NUMBER Page); 00954 00955 NTSTATUS 00956 NTAPI 00957 MiCopyFromUserPage( 00958 PFN_NUMBER NewPage, 00959 PFN_NUMBER OldPage 00960 ); 00961 00962 NTSTATUS 00963 NTAPI 00964 MiZeroPage(PFN_NUMBER Page); 00965 00966 /* memsafe.s *****************************************************************/ 00967 00968 PVOID 00969 FASTCALL 00970 MmSafeReadPtr(PVOID Source); 00971 00972 /* process.c *****************************************************************/ 00973 00974 PVOID 00975 NTAPI 00976 MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node); 00977 00978 VOID 00979 NTAPI 00980 MmDeleteKernelStack(PVOID Stack, 00981 BOOLEAN GuiStack); 00982 00983 /* balace.c ******************************************************************/ 00984 00985 VOID 00986 NTAPI 00987 MmInitializeMemoryConsumer( 00988 ULONG Consumer, 00989 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed) 00990 ); 00991 00992 VOID 00993 NTAPI 00994 MmInitializeBalancer( 00995 ULONG NrAvailablePages, 00996 ULONG NrSystemPages 00997 ); 00998 00999 NTSTATUS 01000 NTAPI 01001 MmReleasePageMemoryConsumer( 01002 ULONG Consumer, 01003 PFN_NUMBER Page 01004 ); 01005 01006 NTSTATUS 01007 NTAPI 01008 MmRequestPageMemoryConsumer( 01009 ULONG Consumer, 01010 BOOLEAN MyWait, 01011 PPFN_NUMBER AllocatedPage 01012 ); 01013 01014 VOID 01015 NTAPI 01016 MiInitBalancerThread(VOID); 01017 01018 VOID 01019 NTAPI 01020 MmRebalanceMemoryConsumers(VOID); 01021 01022 /* rmap.c **************************************************************/ 01023 01024 VOID 01025 NTAPI 01026 MmSetRmapListHeadPage( 01027 PFN_NUMBER Page, 01028 struct _MM_RMAP_ENTRY* ListHead 01029 ); 01030 01031 struct _MM_RMAP_ENTRY* 01032 NTAPI 01033 MmGetRmapListHeadPage(PFN_NUMBER Page); 01034 01035 VOID 01036 NTAPI 01037 MmInsertRmap( 01038 PFN_NUMBER Page, 01039 struct _EPROCESS *Process, 01040 PVOID Address 01041 ); 01042 01043 VOID 01044 NTAPI 01045 MmDeleteAllRmaps( 01046 PFN_NUMBER Page, 01047 PVOID Context, 01048 VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address) 01049 ); 01050 01051 VOID 01052 NTAPI 01053 MmDeleteRmap( 01054 PFN_NUMBER Page, 01055 struct _EPROCESS *Process, 01056 PVOID Address 01057 ); 01058 01059 VOID 01060 NTAPI 01061 MmInitializeRmapList(VOID); 01062 01063 VOID 01064 NTAPI 01065 MmSetCleanAllRmaps(PFN_NUMBER Page); 01066 01067 VOID 01068 NTAPI 01069 MmSetDirtyAllRmaps(PFN_NUMBER Page); 01070 01071 BOOLEAN 01072 NTAPI 01073 MmIsDirtyPageRmap(PFN_NUMBER Page); 01074 01075 NTSTATUS 01076 NTAPI 01077 MmPageOutPhysicalAddress(PFN_NUMBER Page); 01078 01079 /* freelist.c **********************************************************/ 01080 01081 FORCEINLINE 01082 PMMPFN 01083 MiGetPfnEntry(IN PFN_NUMBER Pfn) 01084 { 01085 PMMPFN Page; 01086 extern RTL_BITMAP MiPfnBitMap; 01087 01088 /* Make sure the PFN number is valid */ 01089 if (Pfn > MmHighestPhysicalPage) return NULL; 01090 01091 /* Make sure this page actually has a PFN entry */ 01092 if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, (ULONG)Pfn))) return NULL; 01093 01094 /* Get the entry */ 01095 Page = &MmPfnDatabase[Pfn]; 01096 01097 /* Return it */ 01098 return Page; 01099 }; 01100 01101 FORCEINLINE 01102 PFN_NUMBER 01103 MiGetPfnEntryIndex(IN PMMPFN Pfn1) 01104 { 01105 // 01106 // This will return the Page Frame Number (PFN) from the MMPFN 01107 // 01108 return Pfn1 - MmPfnDatabase; 01109 } 01110 01111 PFN_NUMBER 01112 NTAPI 01113 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage); 01114 01115 PFN_NUMBER 01116 NTAPI 01117 MmGetLRUFirstUserPage(VOID); 01118 01119 VOID 01120 NTAPI 01121 MmInsertLRULastUserPage(PFN_NUMBER Page); 01122 01123 VOID 01124 NTAPI 01125 MmRemoveLRUUserPage(PFN_NUMBER Page); 01126 01127 VOID 01128 NTAPI 01129 MmLockPage(PFN_NUMBER Page); 01130 01131 VOID 01132 NTAPI 01133 MmUnlockPage(PFN_NUMBER Page); 01134 01135 ULONG 01136 NTAPI 01137 MmGetLockCountPage(PFN_NUMBER Page); 01138 01139 VOID 01140 NTAPI 01141 MmInitializePageList( 01142 VOID 01143 ); 01144 01145 VOID 01146 NTAPI 01147 MmDumpArmPfnDatabase( 01148 IN BOOLEAN StatusOnly 01149 ); 01150 01151 PFN_NUMBER 01152 NTAPI 01153 MmGetContinuousPages( 01154 ULONG NumberOfBytes, 01155 PHYSICAL_ADDRESS LowestAcceptableAddress, 01156 PHYSICAL_ADDRESS HighestAcceptableAddress, 01157 PHYSICAL_ADDRESS BoundaryAddressMultiple, 01158 BOOLEAN ZeroPages 01159 ); 01160 01161 VOID 01162 NTAPI 01163 MmZeroPageThread( 01164 VOID 01165 ); 01166 01167 /* hypermap.c *****************************************************************/ 01168 01169 extern PEPROCESS HyperProcess; 01170 extern KIRQL HyperIrql; 01171 01172 PVOID 01173 NTAPI 01174 MiMapPageInHyperSpace(IN PEPROCESS Process, 01175 IN PFN_NUMBER Page, 01176 IN PKIRQL OldIrql); 01177 01178 VOID 01179 NTAPI 01180 MiUnmapPageInHyperSpace(IN PEPROCESS Process, 01181 IN PVOID Address, 01182 IN KIRQL OldIrql); 01183 01184 PVOID 01185 NTAPI 01186 MiMapPagesInZeroSpace(IN PMMPFN Pfn1, 01187 IN PFN_NUMBER NumberOfPages); 01188 01189 VOID 01190 NTAPI 01191 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress, 01192 IN PFN_NUMBER NumberOfPages); 01193 01194 // 01195 // ReactOS Compatibility Layer 01196 // 01197 FORCEINLINE 01198 PVOID 01199 MmCreateHyperspaceMapping(IN PFN_NUMBER Page) 01200 { 01201 HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process; 01202 return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql); 01203 } 01204 01205 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql); 01206 01207 /* i386/page.c *********************************************************/ 01208 01209 NTSTATUS 01210 NTAPI 01211 MmCreateVirtualMappingForKernel( 01212 PVOID Address, 01213 ULONG flProtect, 01214 PPFN_NUMBER Pages, 01215 ULONG PageCount 01216 ); 01217 01218 NTSTATUS 01219 NTAPI 01220 MmCommitPagedPoolAddress( 01221 PVOID Address, 01222 BOOLEAN Locked 01223 ); 01224 01225 NTSTATUS 01226 NTAPI 01227 MmCreateVirtualMapping( 01228 struct _EPROCESS* Process, 01229 PVOID Address, 01230 ULONG flProtect, 01231 PPFN_NUMBER Pages, 01232 ULONG PageCount 01233 ); 01234 01235 NTSTATUS 01236 NTAPI 01237 MmCreateVirtualMappingUnsafe( 01238 struct _EPROCESS* Process, 01239 PVOID Address, 01240 ULONG flProtect, 01241 PPFN_NUMBER Pages, 01242 ULONG PageCount 01243 ); 01244 01245 ULONG 01246 NTAPI 01247 MmGetPageProtect( 01248 struct _EPROCESS* Process, 01249 PVOID Address); 01250 01251 VOID 01252 NTAPI 01253 MmSetPageProtect( 01254 struct _EPROCESS* Process, 01255 PVOID Address, 01256 ULONG flProtect 01257 ); 01258 01259 BOOLEAN 01260 NTAPI 01261 MmIsPagePresent( 01262 struct _EPROCESS* Process, 01263 PVOID Address 01264 ); 01265 01266 VOID 01267 NTAPI 01268 MmInitGlobalKernelPageDirectory(VOID); 01269 01270 VOID 01271 NTAPI 01272 MmDisableVirtualMapping( 01273 struct _EPROCESS *Process, 01274 PVOID Address, 01275 BOOLEAN* WasDirty, 01276 PPFN_NUMBER Page 01277 ); 01278 01279 VOID 01280 NTAPI 01281 MmEnableVirtualMapping( 01282 struct _EPROCESS *Process, 01283 PVOID Address 01284 ); 01285 01286 VOID 01287 NTAPI 01288 MmRawDeleteVirtualMapping(PVOID Address); 01289 01290 01291 VOID 01292 NTAPI 01293 MmGetPageFileMapping( 01294 struct _EPROCESS *Process, 01295 PVOID Address, 01296 SWAPENTRY* SwapEntry); 01297 01298 VOID 01299 NTAPI 01300 MmDeletePageFileMapping( 01301 struct _EPROCESS *Process, 01302 PVOID Address, 01303 SWAPENTRY* SwapEntry 01304 ); 01305 01306 NTSTATUS 01307 NTAPI 01308 MmCreatePageFileMapping( 01309 struct _EPROCESS *Process, 01310 PVOID Address, 01311 SWAPENTRY SwapEntry 01312 ); 01313 01314 BOOLEAN 01315 NTAPI 01316 MmIsPageSwapEntry( 01317 struct _EPROCESS *Process, 01318 PVOID Address 01319 ); 01320 01321 VOID 01322 NTAPI 01323 MmTransferOwnershipPage( 01324 PFN_NUMBER Page, 01325 ULONG NewConsumer 01326 ); 01327 01328 VOID 01329 NTAPI 01330 MmSetDirtyPage( 01331 struct _EPROCESS *Process, 01332 PVOID Address 01333 ); 01334 01335 PFN_NUMBER 01336 NTAPI 01337 MmAllocPage( 01338 ULONG Consumer 01339 ); 01340 01341 LONG 01342 NTAPI 01343 MmAllocPagesSpecifyRange( 01344 ULONG Consumer, 01345 PHYSICAL_ADDRESS LowestAddress, 01346 PHYSICAL_ADDRESS HighestAddress, 01347 ULONG NumberOfPages, 01348 PPFN_NUMBER Pages 01349 ); 01350 01351 VOID 01352 NTAPI 01353 MmDereferencePage(PFN_NUMBER Page); 01354 01355 VOID 01356 NTAPI 01357 MmReferencePage(PFN_NUMBER Page); 01358 01359 ULONG 01360 NTAPI 01361 MmGetReferenceCountPage(PFN_NUMBER Page); 01362 01363 BOOLEAN 01364 NTAPI 01365 MmIsPageInUse(PFN_NUMBER Page); 01366 01367 VOID 01368 NTAPI 01369 MmSetSavedSwapEntryPage( 01370 PFN_NUMBER Page, 01371 SWAPENTRY SavedSwapEntry); 01372 01373 SWAPENTRY 01374 NTAPI 01375 MmGetSavedSwapEntryPage(PFN_NUMBER Page); 01376 01377 VOID 01378 NTAPI 01379 MmSetCleanPage( 01380 struct _EPROCESS *Process, 01381 PVOID Address 01382 ); 01383 01384 NTSTATUS 01385 NTAPI 01386 MmCreatePageTable(PVOID PAddress); 01387 01388 VOID 01389 NTAPI 01390 MmDeletePageTable( 01391 struct _EPROCESS *Process, 01392 PVOID Address 01393 ); 01394 01395 PFN_NUMBER 01396 NTAPI 01397 MmGetPfnForProcess( 01398 struct _EPROCESS *Process, 01399 PVOID Address 01400 ); 01401 01402 BOOLEAN 01403 NTAPI 01404 MmCreateProcessAddressSpace( 01405 IN ULONG MinWs, 01406 IN PEPROCESS Dest, 01407 IN PULONG_PTR DirectoryTableBase 01408 ); 01409 01410 NTSTATUS 01411 NTAPI 01412 MmInitializeHandBuiltProcess( 01413 IN PEPROCESS Process, 01414 IN PULONG_PTR DirectoryTableBase 01415 ); 01416 01417 01418 NTSTATUS 01419 NTAPI 01420 MmInitializeHandBuiltProcess2( 01421 IN PEPROCESS Process 01422 ); 01423 01424 NTSTATUS 01425 NTAPI 01426 MmReleaseMmInfo(struct _EPROCESS *Process); 01427 01428 NTSTATUS 01429 NTAPI 01430 MmSetExecuteOptions(IN ULONG ExecuteOptions); 01431 01432 NTSTATUS 01433 NTAPI 01434 MmGetExecuteOptions(IN PULONG ExecuteOptions); 01435 01436 VOID 01437 NTAPI 01438 MmDeleteProcessPageDirectory(struct _EPROCESS *Process); 01439 01440 VOID 01441 NTAPI 01442 MmDeleteVirtualMapping( 01443 struct _EPROCESS *Process, 01444 PVOID Address, 01445 BOOLEAN FreePage, 01446 BOOLEAN* WasDirty, 01447 PPFN_NUMBER Page 01448 ); 01449 01450 BOOLEAN 01451 NTAPI 01452 MmIsDirtyPage( 01453 struct _EPROCESS *Process, 01454 PVOID Address 01455 ); 01456 01457 VOID 01458 NTAPI 01459 MmMarkPageMapped(PFN_NUMBER Page); 01460 01461 VOID 01462 NTAPI 01463 MmMarkPageUnmapped(PFN_NUMBER Page); 01464 01465 VOID 01466 NTAPI 01467 MmUpdatePageDir( 01468 struct _EPROCESS *Process, 01469 PVOID Address, 01470 ULONG Size 01471 ); 01472 01473 VOID 01474 NTAPI 01475 MiInitPageDirectoryMap(VOID); 01476 01477 ULONG 01478 NTAPI 01479 MiGetUserPageDirectoryCount(VOID); 01480 01481 /* wset.c ********************************************************************/ 01482 01483 NTSTATUS 01484 MmTrimUserMemory( 01485 ULONG Target, 01486 ULONG Priority, 01487 PULONG NrFreedPages 01488 ); 01489 01490 /* region.c ************************************************************/ 01491 01492 NTSTATUS 01493 NTAPI 01494 MmAlterRegion( 01495 PMMSUPPORT AddressSpace, 01496 PVOID BaseAddress, 01497 PLIST_ENTRY RegionListHead, 01498 PVOID StartAddress, 01499 SIZE_T Length, 01500 ULONG NewType, 01501 ULONG NewProtect, 01502 PMM_ALTER_REGION_FUNC AlterFunc 01503 ); 01504 01505 VOID 01506 NTAPI 01507 MmInitializeRegion( 01508 PLIST_ENTRY RegionListHead, 01509 SIZE_T Length, 01510 ULONG Type, 01511 ULONG Protect 01512 ); 01513 01514 PMM_REGION 01515 NTAPI 01516 MmFindRegion( 01517 PVOID BaseAddress, 01518 PLIST_ENTRY RegionListHead, 01519 PVOID Address, 01520 PVOID* RegionBaseAddress 01521 ); 01522 01523 /* section.c *****************************************************************/ 01524 01525 PFILE_OBJECT 01526 NTAPI 01527 MmGetFileObjectForSection( 01528 IN PVOID Section 01529 ); 01530 NTSTATUS 01531 NTAPI 01532 MmGetFileNameForAddress( 01533 IN PVOID Address, 01534 OUT PUNICODE_STRING ModuleName 01535 ); 01536 01537 NTSTATUS 01538 NTAPI 01539 MmGetFileNameForSection( 01540 IN PVOID Section, 01541 OUT POBJECT_NAME_INFORMATION *ModuleName 01542 ); 01543 01544 PVOID 01545 NTAPI 01546 MmAllocateSection( 01547 IN SIZE_T Length, 01548 PVOID BaseAddress 01549 ); 01550 01551 NTSTATUS 01552 NTAPI 01553 MmQuerySectionView( 01554 PMEMORY_AREA MemoryArea, 01555 PVOID Address, 01556 PMEMORY_BASIC_INFORMATION Info, 01557 PSIZE_T ResultLength 01558 ); 01559 01560 NTSTATUS 01561 NTAPI 01562 MmProtectSectionView( 01563 PMMSUPPORT AddressSpace, 01564 PMEMORY_AREA MemoryArea, 01565 PVOID BaseAddress, 01566 SIZE_T Length, 01567 ULONG Protect, 01568 PULONG OldProtect 01569 ); 01570 01571 NTSTATUS 01572 NTAPI 01573 MmInitSectionImplementation(VOID); 01574 01575 NTSTATUS 01576 NTAPI 01577 MmNotPresentFaultSectionView( 01578 PMMSUPPORT AddressSpace, 01579 MEMORY_AREA* MemoryArea, 01580 PVOID Address, 01581 BOOLEAN Locked 01582 ); 01583 01584 NTSTATUS 01585 NTAPI 01586 MmPageOutSectionView( 01587 PMMSUPPORT AddressSpace, 01588 PMEMORY_AREA MemoryArea, 01589 PVOID Address, 01590 ULONG_PTR Entry 01591 ); 01592 01593 NTSTATUS 01594 NTAPI 01595 MmCreatePhysicalMemorySection(VOID); 01596 01597 NTSTATUS 01598 NTAPI 01599 MmAccessFaultSectionView( 01600 PMMSUPPORT AddressSpace, 01601 MEMORY_AREA* MemoryArea, 01602 PVOID Address 01603 ); 01604 01605 VOID 01606 NTAPI 01607 MmFreeSectionSegments(PFILE_OBJECT FileObject); 01608 01609 /* mpw.c *********************************************************************/ 01610 01611 NTSTATUS 01612 NTAPI 01613 MmInitMpwThread(VOID); 01614 01615 NTSTATUS 01616 NTAPI 01617 MmInitBsmThread(VOID); 01618 01619 /* pager.c *******************************************************************/ 01620 01621 BOOLEAN 01622 NTAPI 01623 MiIsPagerThread(VOID); 01624 01625 VOID 01626 NTAPI 01627 MiStartPagerThread(VOID); 01628 01629 VOID 01630 NTAPI 01631 MiStopPagerThread(VOID); 01632 01633 NTSTATUS 01634 FASTCALL 01635 MiQueryVirtualMemory( 01636 IN HANDLE ProcessHandle, 01637 IN PVOID Address, 01638 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, 01639 OUT PVOID VirtualMemoryInformation, 01640 IN SIZE_T Length, 01641 OUT PSIZE_T ResultLength 01642 ); 01643 01644 /* sysldr.c ******************************************************************/ 01645 01646 VOID 01647 NTAPI 01648 MiReloadBootLoadedDrivers( 01649 IN PLOADER_PARAMETER_BLOCK LoaderBlock 01650 ); 01651 01652 BOOLEAN 01653 NTAPI 01654 MiInitializeLoadedModuleList( 01655 IN PLOADER_PARAMETER_BLOCK LoaderBlock 01656 ); 01657 01658 NTSTATUS 01659 NTAPI 01660 MmLoadSystemImage( 01661 IN PUNICODE_STRING FileName, 01662 IN PUNICODE_STRING NamePrefix OPTIONAL, 01663 IN PUNICODE_STRING LoadedName OPTIONAL, 01664 IN ULONG Flags, 01665 OUT PVOID *ModuleObject, 01666 OUT PVOID *ImageBaseAddress 01667 ); 01668 01669 NTSTATUS 01670 NTAPI 01671 MmUnloadSystemImage( 01672 IN PVOID ImageHandle 01673 ); 01674 01675 NTSTATUS 01676 NTAPI 01677 MmCheckSystemImage( 01678 IN HANDLE ImageHandle, 01679 IN BOOLEAN PurgeSection 01680 ); 01681 01682 NTSTATUS 01683 NTAPI 01684 MmCallDllInitialize( 01685 IN PLDR_DATA_TABLE_ENTRY LdrEntry, 01686 IN PLIST_ENTRY ListHead 01687 ); 01688 01689 01690 /* procsup.c *****************************************************************/ 01691 01692 NTSTATUS 01693 NTAPI 01694 MmGrowKernelStack( 01695 IN PVOID StackPointer 01696 ); 01697 01698 01699 FORCEINLINE 01700 VOID 01701 MmLockAddressSpace(PMMSUPPORT AddressSpace) 01702 { 01703 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock); 01704 //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 0); 01705 //Thread->OwnsProcessAddressSpaceExclusive = TRUE; 01706 } 01707 01708 FORCEINLINE 01709 VOID 01710 MmUnlockAddressSpace(PMMSUPPORT AddressSpace) 01711 { 01712 //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 1); 01713 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock); 01714 //Thread->OwnsProcessAddressSpaceExclusive = 0; 01715 } 01716 01717 FORCEINLINE 01718 PEPROCESS 01719 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace) 01720 { 01721 if (AddressSpace == MmKernelAddressSpace) return NULL; 01722 return CONTAINING_RECORD(AddressSpace, EPROCESS, Vm); 01723 } 01724 01725 FORCEINLINE 01726 PMMSUPPORT 01727 MmGetCurrentAddressSpace(VOID) 01728 { 01729 return &((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->Vm; 01730 } 01731 01732 FORCEINLINE 01733 PMMSUPPORT 01734 MmGetKernelAddressSpace(VOID) 01735 { 01736 return MmKernelAddressSpace; 01737 } Generated on Sun May 27 2012 04:19:15 for ReactOS by
1.7.6.1
|