3 #include <internal/arch/mm.h>
5 /* TYPES *********************************************************************/
9 extern PMMSUPPORT MmKernelAddressSpace
;
10 extern PFN_COUNT MiFreeSwapPages
;
11 extern PFN_COUNT MiUsedSwapPages
;
12 extern SIZE_T MmTotalPagedPoolQuota
;
13 extern SIZE_T MmTotalNonPagedPoolQuota
;
14 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
15 extern PFN_COUNT MmNumberOfPhysicalPages
;
16 extern UCHAR MmDisablePagingExecutive
;
17 extern PFN_NUMBER MmLowestPhysicalPage
;
18 extern PFN_NUMBER MmHighestPhysicalPage
;
19 extern PFN_NUMBER MmAvailablePages
;
20 extern PFN_NUMBER MmResidentAvailablePages
;
22 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
23 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
25 extern LIST_ENTRY MmLoadedUserImageList
;
27 extern KMUTANT MmSystemLoadLock
;
29 extern ULONG MmNumberOfPagingFiles
;
31 extern PVOID MmUnloadedDrivers
;
32 extern PVOID MmLastUnloadedDrivers
;
33 extern PVOID MmTriageActionTaken
;
34 extern PVOID KernelVerifier
;
35 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
37 extern SIZE_T MmTotalCommitLimit
;
38 extern SIZE_T MmTotalCommittedPages
;
39 extern SIZE_T MmSharedCommit
;
40 extern SIZE_T MmDriverCommit
;
41 extern SIZE_T MmProcessCommit
;
42 extern SIZE_T MmPagedPoolCommit
;
43 extern SIZE_T MmPeakCommitment
;
44 extern SIZE_T MmtotalCommitLimitMaximum
;
46 extern PVOID MiDebugMapping
;
47 extern PMMPTE MmDebugPte
;
51 struct _MM_RMAP_ENTRY
;
53 typedef ULONG_PTR SWAPENTRY
;
56 // MmDbgCopyMemory Flags
58 #define MMDBG_COPY_WRITE 0x00000001
59 #define MMDBG_COPY_PHYSICAL 0x00000002
60 #define MMDBG_COPY_UNSAFE 0x00000004
61 #define MMDBG_COPY_CACHED 0x00000008
62 #define MMDBG_COPY_UNCACHED 0x00000010
63 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
66 // Maximum chunk size per copy
68 #define MMDBG_COPY_MAX_SIZE 0x8
71 #define MI_STATIC_MEMORY_AREAS (14)
73 #define MI_STATIC_MEMORY_AREAS (13)
76 #define MEMORY_AREA_SECTION_VIEW (1)
77 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
78 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
79 #define MEMORY_AREA_STATIC (0x80000000)
81 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
83 #define MM_CORE_DUMP_TYPE_NONE (0x0)
84 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
85 #define MM_CORE_DUMP_TYPE_FULL (0x2)
87 #define MM_PAGEOP_PAGEIN (1)
88 #define MM_PAGEOP_PAGEOUT (2)
89 #define MM_PAGEOP_PAGESYNCH (3)
90 #define MM_PAGEOP_ACCESSFAULT (4)
91 #define MM_PAGEOP_CHANGEPROTECT (5)
93 /* Number of list heads to use */
94 #define MI_FREE_POOL_LISTS 4
97 /* Signature of free pool blocks */
98 #define MM_FREE_POOL_TAG 'lprF'
100 /* Although Microsoft says this isn't hardcoded anymore,
101 they won't be able to change it. Stuff depends on it */
102 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
104 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
107 * Additional flags for protection attributes
109 #define PAGE_WRITETHROUGH (1024)
110 #define PAGE_SYSTEM (2048)
112 #define SEC_PHYSICALMEMORY (0x80000000)
114 #define MM_PAGEFILE_SEGMENT (0x1)
115 #define MM_DATAFILE_SEGMENT (0x2)
119 #define MC_SYSTEM (2)
120 #define MC_MAXIMUM (3)
122 #define PAGED_POOL_MASK 1
123 #define MUST_SUCCEED_POOL_MASK 2
124 #define CACHE_ALIGNED_POOL_MASK 4
125 #define QUOTA_POOL_MASK 8
126 #define SESSION_POOL_MASK 32
127 #define VERIFIER_POOL_MASK 64
129 #define MM_PAGED_POOL_SIZE (100*1024*1024)
130 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
133 * Paged and non-paged pools are 8-byte aligned
135 #define MM_POOL_ALIGNMENT 8
137 #define MM_ROUND_UP(x,s) \
138 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
140 #define MM_ROUND_DOWN(x,s) \
141 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
143 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
148 PAGE_EXECUTE_READ | \
149 PAGE_EXECUTE_READWRITE | \
150 PAGE_EXECUTE_WRITECOPY | \
155 #define PAGE_FLAGS_VALID_FOR_SECTION \
160 PAGE_EXECUTE_READ | \
161 PAGE_EXECUTE_READWRITE | \
162 PAGE_EXECUTE_WRITECOPY | \
165 #define PAGE_IS_READABLE \
169 PAGE_EXECUTE_READ | \
170 PAGE_EXECUTE_READWRITE | \
171 PAGE_EXECUTE_WRITECOPY)
173 #define PAGE_IS_WRITABLE \
176 PAGE_EXECUTE_READWRITE | \
177 PAGE_EXECUTE_WRITECOPY)
179 #define PAGE_IS_EXECUTABLE \
181 PAGE_EXECUTE_READ | \
182 PAGE_EXECUTE_READWRITE | \
183 PAGE_EXECUTE_WRITECOPY)
185 #define PAGE_IS_WRITECOPY \
187 PAGE_EXECUTE_WRITECOPY)
190 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
191 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
193 #define InterlockedExchangePte(PointerPte, Value) \
194 InterlockedExchange((PLONG)(PointerPte), Value)
198 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
199 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
203 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
204 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
206 typedef struct _MM_SECTION_SEGMENT
208 LONG FileOffset
; /* start offset into the file for image sections */
209 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
210 ULONG RawLength
; /* length of the segment which is part of the mapped file */
211 SIZE_T Length
; /* absolute length of the segment */
213 FAST_MUTEX Lock
; /* lock which protects the page directory */
214 ULONG ReferenceCount
;
215 SECTION_PAGE_DIRECTORY PageDirectory
;
217 ULONG Characteristics
;
219 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
221 typedef struct _MM_IMAGE_SECTION_OBJECT
224 ULONG_PTR StackReserve
;
225 ULONG_PTR StackCommit
;
226 ULONG_PTR EntryPoint
;
228 USHORT ImageCharacteristics
;
229 USHORT MinorSubsystemVersion
;
230 USHORT MajorSubsystemVersion
;
235 PMM_SECTION_SEGMENT Segments
;
236 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
238 typedef struct _ROS_SECTION_OBJECT
242 LARGE_INTEGER MaximumSize
;
243 ULONG SectionPageProtection
;
244 ULONG AllocationAttributes
;
245 PFILE_OBJECT FileObject
;
248 PMM_IMAGE_SECTION_OBJECT ImageSection
;
249 PMM_SECTION_SEGMENT Segment
;
251 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
253 struct _MM_CACHE_SECTION_SEGMENT
;
255 typedef struct _MEMORY_AREA
257 PVOID StartingAddress
;
259 struct _MEMORY_AREA
*Parent
;
260 struct _MEMORY_AREA
*LeftChild
;
261 struct _MEMORY_AREA
*RightChild
;
265 BOOLEAN DeleteInProgress
;
272 ROS_SECTION_OBJECT
* Section
;
274 PMM_SECTION_SEGMENT Segment
;
275 LIST_ENTRY RegionListHead
;
279 LARGE_INTEGER ViewOffset
;
280 struct _MM_CACHE_SECTION_SEGMENT
*Segment
;
284 LIST_ENTRY RegionListHead
;
287 } MEMORY_AREA
, *PMEMORY_AREA
;
289 typedef struct _MM_RMAP_ENTRY
291 struct _MM_RMAP_ENTRY
* Next
;
298 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
301 extern ULONG MI_PFN_CURRENT_USAGE
;
302 extern CHAR MI_PFN_CURRENT_PROCESS_NAME
[16];
303 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
304 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
306 #define MI_SET_USAGE(x)
307 #define MI_SET_PROCESS2(x)
310 typedef enum _MI_PFN_USAGES
312 MI_USAGE_NOT_SET
= 0,
314 MI_USAGE_NONPAGED_POOL
,
315 MI_USAGE_NONPAGED_POOL_EXPANSION
,
316 MI_USAGE_KERNEL_STACK
,
317 MI_USAGE_KERNEL_STACK_EXPANSION
,
323 MI_USAGE_PAGE_DIRECTORY
,
324 MI_USAGE_LEGACY_PAGE_DIRECTORY
,
325 MI_USAGE_DRIVER_PAGE
,
326 MI_USAGE_CONTINOUS_ALLOCATION
,
328 MI_USAGE_DEMAND_ZERO
,
331 MI_USAGE_PFN_DATABASE
,
332 MI_USAGE_BOOT_DRIVER
,
333 MI_USAGE_INIT_MEMORY
,
338 // These two mappings are actually used by Windows itself, based on the ASSERTS
340 #define StartOfAllocation ReadInProgress
341 #define EndOfAllocation WriteInProgress
343 typedef struct _MMPFNENTRY
346 USHORT ReadInProgress
:1; // StartOfAllocation
347 USHORT WriteInProgress
:1; // EndOfAllocation
348 USHORT PrototypePte
:1;
350 USHORT PageLocation
:3;
351 USHORT RemovalRequested
:1;
352 USHORT CacheAttribute
:2;
354 USHORT ParityError
:1; // HasRmap
357 typedef struct _MMPFN
362 ULONG WsIndex
; // SavedSwapEntry
365 SINGLE_LIST_ENTRY NextStackPfn
;
371 ULONG_PTR ShareCount
;
377 USHORT ReferenceCount
; // ReferenceCount
382 USHORT ReferenceCount
;
389 LONG AweReferenceCount
; // RmapListHead
393 ULONG_PTR EntireFrame
;
396 ULONG_PTR PteFrame
:25;
397 ULONG_PTR InPageError
:1;
398 ULONG_PTR VerifierAllocation
:1;
399 ULONG_PTR AweAllocation
:1;
400 ULONG_PTR Priority
:3;
401 ULONG_PTR MustBeCached
:1;
405 MI_PFN_USAGES PfnUsage
;
406 CHAR ProcessName
[16];
410 extern PMMPFN MmPfnDatabase
;
412 typedef struct _MMPFNLIST
418 } MMPFNLIST
, *PMMPFNLIST
;
420 extern MMPFNLIST MmZeroedPageListHead
;
421 extern MMPFNLIST MmFreePageListHead
;
422 extern MMPFNLIST MmStandbyPageListHead
;
423 extern MMPFNLIST MmModifiedPageListHead
;
424 extern MMPFNLIST MmModifiedNoWritePageListHead
;
426 typedef struct _MM_PAGEOP
428 /* Type of operation. */
430 /* Number of threads interested in this operation. */
431 ULONG ReferenceCount
;
432 /* Event that will be set when the operation is completed. */
433 KEVENT CompletionEvent
;
434 /* Status of the operation once it is completed. */
436 /* TRUE if the operation was abandoned. */
438 /* The memory area to be affected by the operation. */
441 struct _MM_PAGEOP
* Next
;
442 struct _ETHREAD
* Thread
;
444 * These fields are used to identify the operation if it is against a
445 * virtual memory area.
450 * These fields are used to identify the operation if it is against a
453 PMM_SECTION_SEGMENT Segment
;
455 } MM_PAGEOP
, *PMM_PAGEOP
;
457 typedef struct _MM_MEMORY_CONSUMER
461 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
462 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
464 typedef struct _MM_REGION
469 LIST_ENTRY RegionListEntry
;
470 } MM_REGION
, *PMM_REGION
;
472 /* Entry describing free pool memory */
473 typedef struct _MMFREE_POOL_ENTRY
478 struct _MMFREE_POOL_ENTRY
*Owner
;
479 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
481 /* Signature of a freed block */
482 #define MM_FREE_POOL_SIGNATURE 'ARM3'
484 /* Paged pool information */
485 typedef struct _MM_PAGED_POOL_INFO
487 PRTL_BITMAP PagedPoolAllocationMap
;
488 PRTL_BITMAP EndOfPagedPoolBitmap
;
489 PMMPTE FirstPteForPagedPool
;
490 PMMPTE LastPteForPagedPool
;
491 PMMPDE NextPdeForPagedPoolExpansion
;
493 SIZE_T PagedPoolCommit
;
494 SIZE_T AllocatedPagedPool
;
495 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
497 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
500 (*PMM_ALTER_REGION_FUNC
)(
501 PMMSUPPORT AddressSpace
,
511 (*PMM_FREE_PAGE_FUNC
)(
513 PMEMORY_AREA MemoryArea
,
521 // Mm copy support for Kd
533 // Determines if a given address is a session address
541 /* marea.c *******************************************************************/
546 PMMSUPPORT AddressSpace
,
551 PMEMORY_AREA
*Result
,
552 BOOLEAN FixedAddress
,
553 ULONG AllocationFlags
,
554 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
559 MmLocateMemoryAreaByAddress(
560 PMMSUPPORT AddressSpace
,
567 PMMSUPPORT AddressSpace
,
574 PMMSUPPORT AddressSpace
,
575 PMEMORY_AREA MemoryArea
,
576 PMM_FREE_PAGE_FUNC FreePage
,
577 PVOID FreePageContext
582 MmFreeMemoryAreaByPtr(
583 PMMSUPPORT AddressSpace
,
585 PMM_FREE_PAGE_FUNC FreePage
,
586 PVOID FreePageContext
591 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
595 MmLocateMemoryAreaByRegion(
596 PMMSUPPORT AddressSpace
,
604 PMMSUPPORT AddressSpace
,
606 ULONG_PTR Granularity
,
612 MmReleaseMemoryAreaIfDecommitted(
613 struct _EPROCESS
*Process
,
614 PMMSUPPORT AddressSpace
,
620 MmMapMemoryArea(PVOID BaseAddress
,
625 /* npool.c *******************************************************************/
629 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
633 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
637 MiInitializeNonPagedPool(VOID
);
642 IN POOL_TYPE PoolType
,
643 IN SIZE_T SizeInBytes
649 IN PVOID VirtualAddress
655 IN PVOID StartingAddress
665 /* pool.c *******************************************************************/
669 ExAllocateNonPagedPoolWithTag(
678 ExAllocatePagedPoolWithTag(
686 ExFreeNonPagedPool(PVOID block
);
690 ExFreePagedPool(IN PVOID Block
);
694 ExpIsPoolTagDebuggable(ULONG Tag
);
698 ExpAllocateDebugPool(
708 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
712 MmInitializePagedPool(VOID
);
716 MiAllocateSpecialPool(
717 IN POOL_TYPE PoolType
,
718 IN SIZE_T NumberOfBytes
,
726 IN POOL_TYPE PoolType
,
727 IN ULONG CurrentMaxQuota
,
728 OUT PULONG NewMaxQuota
731 /* mdl.c *********************************************************************/
740 /* mminit.c ******************************************************************/
744 MiShutdownMemoryManager(VOID
);
754 MmInitSystem(IN ULONG Phase
,
755 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
759 MiFreeInitMemory(VOID
);
763 MmInitializeMdlImplementation(VOID
);
765 /* pagefile.c ****************************************************************/
769 MmAllocSwapPage(VOID
);
773 MmDereserveSwapPages(ULONG Nr
);
777 MmFreeSwapPage(SWAPENTRY Entry
);
781 MmInitPagingFile(VOID
);
785 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject
);
796 MmReserveSwapPages(ULONG Nr
);
809 ULONG BugCodeParameter1
,
810 ULONG BugCodeParameter2
,
811 ULONG BugCodeParameter3
,
812 ULONG BugCodeParameter4
,
813 struct _KTRAP_FRAME
* TrapFrame
818 MmIsAvailableSwapPage(VOID
);
822 MmShowOutOfSpaceMessagePagingFile(VOID
);
824 /* process.c ****************************************************************/
828 MmInitializeProcessAddressSpace(
829 IN PEPROCESS Process
,
830 IN PEPROCESS Clone OPTIONAL
,
831 IN PVOID Section OPTIONAL
,
833 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
839 IN PEPROCESS Process
,
840 IN PINITIAL_PEB InitialPeb
,
847 IN PEPROCESS Process
,
848 IN PCLIENT_ID ClientId
,
849 IN PINITIAL_TEB InitialTeb
,
856 struct _EPROCESS
*Process
,
862 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
866 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
870 MmGetSessionLocaleId(VOID
);
874 MmSetMemoryPriorityProcess(
875 IN PEPROCESS Process
,
876 IN UCHAR MemoryPriority
879 /* i386/pfault.c *************************************************************/
891 /* special.c *****************************************************************/
895 MiInitializeSpecialPool();
900 IN SIZE_T NumberOfBytes
,
905 MmIsSpecialPoolAddress(
910 MmAllocateSpecialPool(
911 IN SIZE_T NumberOfBytes
,
913 IN POOL_TYPE PoolType
,
914 IN ULONG SpecialType
);
921 /* mm.c **********************************************************************/
926 IN BOOLEAN StoreInstruction
,
928 IN KPROCESSOR_MODE Mode
,
929 IN PVOID TrapInformation
932 /* anonmem.c *****************************************************************/
936 MmNotPresentFaultVirtualMemory(
937 PMMSUPPORT AddressSpace
,
938 MEMORY_AREA
* MemoryArea
,
944 MmPageOutVirtualMemory(
945 PMMSUPPORT AddressSpace
,
946 PMEMORY_AREA MemoryArea
,
948 struct _MM_PAGEOP
* PageOp
954 PMEMORY_AREA MemoryArea
,
956 PMEMORY_BASIC_INFORMATION Info
,
963 struct _EPROCESS
* Process
,
964 PMEMORY_AREA MemoryArea
970 PMMSUPPORT AddressSpace
,
971 PMEMORY_AREA MemoryArea
,
980 MmWritePageVirtualMemory(
981 PMMSUPPORT AddressSpace
,
987 /* kmap.c ********************************************************************/
991 ExAllocatePage(VOID
);
995 ExUnmapPage(PVOID Addr
);
999 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
1010 MiZeroPage(PFN_NUMBER Page
);
1012 /* memsafe.s *****************************************************************/
1016 MmSafeReadPtr(PVOID Source
);
1018 /* pageop.c ******************************************************************/
1022 MmReleasePageOp(PMM_PAGEOP PageOp
);
1030 PMM_SECTION_SEGMENT Segment
,
1042 PMM_SECTION_SEGMENT Segment
,
1048 MmInitializePageOp(VOID
);
1050 /* process.c *****************************************************************/
1054 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
1058 MmDeleteKernelStack(PVOID Stack
,
1061 /* balace.c ******************************************************************/
1065 MmInitializeMemoryConsumer(
1067 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
1072 MmInitializeBalancer(
1073 ULONG NrAvailablePages
,
1079 MmReleasePageMemoryConsumer(
1086 MmRequestPageMemoryConsumer(
1089 PPFN_NUMBER AllocatedPage
1094 MiInitBalancerThread(VOID
);
1098 MmRebalanceMemoryConsumers(VOID
);
1100 /* rmap.c **************************************************************/
1104 MmSetRmapListHeadPage(
1106 struct _MM_RMAP_ENTRY
* ListHead
1109 struct _MM_RMAP_ENTRY
*
1111 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1117 struct _EPROCESS
*Process
,
1126 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1133 struct _EPROCESS
*Process
,
1139 MmInitializeRmapList(VOID
);
1143 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1147 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1151 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1155 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1157 /* freelist.c **********************************************************/
1161 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1164 extern RTL_BITMAP MiPfnBitMap
;
1166 /* Make sure the PFN number is valid */
1167 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1169 /* Make sure this page actually has a PFN entry */
1170 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, (ULONG
)Pfn
))) return NULL
;
1173 Page
= &MmPfnDatabase
[Pfn
];
1181 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1184 // This will return the Page Frame Number (PFN) from the MMPFN
1186 return Pfn1
- MmPfnDatabase
;
1191 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1195 MmGetLRUFirstUserPage(VOID
);
1199 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1203 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1207 MmLockPage(PFN_NUMBER Page
);
1211 MmUnlockPage(PFN_NUMBER Page
);
1215 MmGetLockCountPage(PFN_NUMBER Page
);
1219 MmInitializePageList(
1225 MmDumpArmPfnDatabase(
1226 IN BOOLEAN StatusOnly
1231 MmGetContinuousPages(
1232 ULONG NumberOfBytes
,
1233 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1234 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1235 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1245 /* hypermap.c *****************************************************************/
1247 extern PEPROCESS HyperProcess
;
1248 extern KIRQL HyperIrql
;
1252 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1258 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1264 MiMapPagesInZeroSpace(IN PMMPFN Pfn1
,
1265 IN PFN_NUMBER NumberOfPages
);
1269 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1270 IN PFN_NUMBER NumberOfPages
);
1273 // ReactOS Compatibility Layer
1277 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1279 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1280 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1283 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1285 /* i386/page.c *********************************************************/
1289 MmCreateVirtualMappingForKernel(
1298 MmCommitPagedPoolAddress(
1305 MmCreateVirtualMapping(
1306 struct _EPROCESS
* Process
,
1315 MmCreateVirtualMappingUnsafe(
1316 struct _EPROCESS
* Process
,
1326 struct _EPROCESS
* Process
,
1332 struct _EPROCESS
* Process
,
1340 struct _EPROCESS
* Process
,
1346 MmInitGlobalKernelPageDirectory(VOID
);
1350 MmDisableVirtualMapping(
1351 struct _EPROCESS
*Process
,
1359 MmEnableVirtualMapping(
1360 struct _EPROCESS
*Process
,
1366 MmRawDeleteVirtualMapping(PVOID Address
);
1371 MmGetPageFileMapping(
1372 struct _EPROCESS
*Process
,
1374 SWAPENTRY
* SwapEntry
);
1378 MmDeletePageFileMapping(
1379 struct _EPROCESS
*Process
,
1381 SWAPENTRY
* SwapEntry
1386 MmCreatePageFileMapping(
1387 struct _EPROCESS
*Process
,
1395 struct _EPROCESS
*Process
,
1401 MmTransferOwnershipPage(
1409 struct _EPROCESS
*Process
,
1421 MmAllocPagesSpecifyRange(
1423 PHYSICAL_ADDRESS LowestAddress
,
1424 PHYSICAL_ADDRESS HighestAddress
,
1425 ULONG NumberOfPages
,
1431 MmDereferencePage(PFN_NUMBER Page
);
1435 MmReferencePage(PFN_NUMBER Page
);
1439 MmGetReferenceCountPage(PFN_NUMBER Page
);
1443 MmIsPageInUse(PFN_NUMBER Page
);
1447 MmSetSavedSwapEntryPage(
1449 SWAPENTRY SavedSwapEntry
);
1453 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1458 struct _EPROCESS
*Process
,
1464 MmCreatePageTable(PVOID PAddress
);
1469 struct _EPROCESS
*Process
,
1476 struct _EPROCESS
*Process
,
1482 MmCreateProcessAddressSpace(
1485 IN PULONG_PTR DirectoryTableBase
1490 MmInitializeHandBuiltProcess(
1491 IN PEPROCESS Process
,
1492 IN PULONG_PTR DirectoryTableBase
1498 MmInitializeHandBuiltProcess2(
1499 IN PEPROCESS Process
1504 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1508 MmDeleteProcessPageDirectory(struct _EPROCESS
*Process
);
1512 MmDeleteVirtualMapping(
1513 struct _EPROCESS
*Process
,
1523 struct _EPROCESS
*Process
,
1529 MmMarkPageMapped(PFN_NUMBER Page
);
1533 MmMarkPageUnmapped(PFN_NUMBER Page
);
1538 struct _EPROCESS
*Process
,
1545 MiInitPageDirectoryMap(VOID
);
1549 MiGetUserPageDirectoryCount(VOID
);
1551 /* wset.c ********************************************************************/
1560 /* region.c ************************************************************/
1565 PMMSUPPORT AddressSpace
,
1567 PLIST_ENTRY RegionListHead
,
1572 PMM_ALTER_REGION_FUNC AlterFunc
1578 PLIST_ENTRY RegionListHead
,
1588 PLIST_ENTRY RegionListHead
,
1590 PVOID
* RegionBaseAddress
1593 /* section.c *****************************************************************/
1597 MmGetFileObjectForSection(
1602 MmGetFileNameForAddress(
1604 OUT PUNICODE_STRING ModuleName
1609 MmGetFileNameForSection(
1611 OUT POBJECT_NAME_INFORMATION
*ModuleName
1624 PMEMORY_AREA MemoryArea
,
1626 PMEMORY_BASIC_INFORMATION Info
,
1627 PSIZE_T ResultLength
1632 MmProtectSectionView(
1633 PMMSUPPORT AddressSpace
,
1634 PMEMORY_AREA MemoryArea
,
1643 MmInitSectionImplementation(VOID
);
1647 MmNotPresentFaultSectionView(
1648 PMMSUPPORT AddressSpace
,
1649 MEMORY_AREA
* MemoryArea
,
1655 MmPageOutSectionView(
1656 PMMSUPPORT AddressSpace
,
1657 PMEMORY_AREA MemoryArea
,
1659 struct _MM_PAGEOP
*PageOp
1664 MmCreatePhysicalMemorySection(VOID
);
1668 MmAccessFaultSectionView(
1669 PMMSUPPORT AddressSpace
,
1670 MEMORY_AREA
* MemoryArea
,
1676 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1678 /* mpw.c *********************************************************************/
1682 MmInitMpwThread(VOID
);
1686 MmInitBsmThread(VOID
);
1688 /* pager.c *******************************************************************/
1692 MiIsPagerThread(VOID
);
1696 MiStartPagerThread(VOID
);
1700 MiStopPagerThread(VOID
);
1704 MiQueryVirtualMemory(
1705 IN HANDLE ProcessHandle
,
1707 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1708 OUT PVOID VirtualMemoryInformation
,
1710 OUT PSIZE_T ResultLength
1713 /* sysldr.c ******************************************************************/
1717 MiReloadBootLoadedDrivers(
1718 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1723 MiInitializeLoadedModuleList(
1724 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1730 IN PUNICODE_STRING FileName
,
1731 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1732 IN PUNICODE_STRING LoadedName OPTIONAL
,
1734 OUT PVOID
*ModuleObject
,
1735 OUT PVOID
*ImageBaseAddress
1740 MmUnloadSystemImage(
1741 IN PVOID ImageHandle
1747 IN HANDLE ImageHandle
,
1748 IN BOOLEAN PurgeSection
1753 MmCallDllInitialize(
1754 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1755 IN PLIST_ENTRY ListHead
1759 /* procsup.c *****************************************************************/
1764 IN PVOID StackPointer
1770 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1772 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1777 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1779 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1784 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1786 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1787 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1792 MmGetCurrentAddressSpace(VOID
)
1794 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1799 MmGetKernelAddressSpace(VOID
)
1801 return MmKernelAddressSpace
;