3 #include <internal/arch/mm.h>
5 /* TYPES *********************************************************************/
9 extern PFN_NUMBER MiFreeSwapPages
;
10 extern PFN_NUMBER MiUsedSwapPages
;
11 extern SIZE_T MmPagedPoolSize
;
12 extern SIZE_T MmTotalPagedPoolQuota
;
13 extern SIZE_T MmTotalNonPagedPoolQuota
;
14 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
15 extern PFN_NUMBER 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
;
21 extern ULONG_PTR MmNumberOfSystemPtes
;
23 extern PVOID MmPagedPoolBase
;
24 extern SIZE_T MmPagedPoolSize
;
26 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
27 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
29 extern LIST_ENTRY MmLoadedUserImageList
;
31 extern KMUTANT MmSystemLoadLock
;
33 extern ULONG MmNumberOfPagingFiles
;
35 extern PVOID MmUnloadedDrivers
;
36 extern PVOID MmLastUnloadedDrivers
;
37 extern PVOID MmTriageActionTaken
;
38 extern PVOID KernelVerifier
;
39 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
41 extern SIZE_T MmTotalCommitLimit
;
42 extern SIZE_T MmTotalCommittedPages
;
43 extern SIZE_T MmSharedCommit
;
44 extern SIZE_T MmDriverCommit
;
45 extern SIZE_T MmProcessCommit
;
46 extern SIZE_T MmPagedPoolCommit
;
47 extern SIZE_T MmPeakCommitment
;
48 extern SIZE_T MmtotalCommitLimitMaximum
;
50 extern PVOID MiDebugMapping
;
51 extern PMMPTE MmDebugPte
;
55 struct _MM_RMAP_ENTRY
;
57 typedef ULONG SWAPENTRY
;
60 // MmDbgCopyMemory Flags
62 #define MMDBG_COPY_WRITE 0x00000001
63 #define MMDBG_COPY_PHYSICAL 0x00000002
64 #define MMDBG_COPY_UNSAFE 0x00000004
65 #define MMDBG_COPY_CACHED 0x00000008
66 #define MMDBG_COPY_UNCACHED 0x00000010
67 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
70 // Maximum chunk size per copy
72 #define MMDBG_COPY_MAX_SIZE 0x8
75 #define MI_STATIC_MEMORY_AREAS (14)
77 #define MI_STATIC_MEMORY_AREAS (13)
80 #define MEMORY_AREA_INVALID (0)
81 #define MEMORY_AREA_SECTION_VIEW (1)
82 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
83 #define MEMORY_AREA_NO_CACHE (3)
84 #define MEMORY_AREA_IO_MAPPING (4)
85 #define MEMORY_AREA_SYSTEM (5)
86 #define MEMORY_AREA_MDL_MAPPING (7)
87 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
88 #define MEMORY_AREA_CACHE_SEGMENT (9)
89 #define MEMORY_AREA_SHARED_DATA (10)
90 #define MEMORY_AREA_KERNEL_STACK (11)
91 #define MEMORY_AREA_PAGED_POOL (12)
92 #define MEMORY_AREA_NO_ACCESS (13)
93 #define MEMORY_AREA_PEB_OR_TEB (14)
94 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
95 #define MEMORY_AREA_STATIC (0x80000000)
97 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
99 #define MM_CORE_DUMP_TYPE_NONE (0x0)
100 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
101 #define MM_CORE_DUMP_TYPE_FULL (0x2)
103 #define MM_PAGEOP_PAGEIN (1)
104 #define MM_PAGEOP_PAGEOUT (2)
105 #define MM_PAGEOP_PAGESYNCH (3)
106 #define MM_PAGEOP_ACCESSFAULT (4)
108 /* Number of list heads to use */
109 #define MI_FREE_POOL_LISTS 4
112 /* Signature of free pool blocks */
113 #define MM_FREE_POOL_TAG 'lprF'
115 /* Although Microsoft says this isn't hardcoded anymore,
116 they won't be able to change it. Stuff depends on it */
117 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
119 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
122 * Additional flags for protection attributes
124 #define PAGE_WRITETHROUGH (1024)
125 #define PAGE_SYSTEM (2048)
127 #define SEC_PHYSICALMEMORY (0x80000000)
129 #define MM_PAGEFILE_SEGMENT (0x1)
130 #define MM_DATAFILE_SEGMENT (0x2)
135 #define MC_NPPOOL (3)
136 #define MC_SYSTEM (4)
137 #define MC_MAXIMUM (5)
139 #define PAGED_POOL_MASK 1
140 #define MUST_SUCCEED_POOL_MASK 2
141 #define CACHE_ALIGNED_POOL_MASK 4
142 #define QUOTA_POOL_MASK 8
143 #define SESSION_POOL_MASK 32
144 #define VERIFIER_POOL_MASK 64
146 #define MM_PAGED_POOL_SIZE (100*1024*1024)
147 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
150 * Paged and non-paged pools are 8-byte aligned
152 #define MM_POOL_ALIGNMENT 8
154 #define MM_ROUND_UP(x,s) \
155 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
157 #define MM_ROUND_DOWN(x,s) \
158 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
160 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
165 PAGE_EXECUTE_READ | \
166 PAGE_EXECUTE_READWRITE | \
167 PAGE_EXECUTE_WRITECOPY | \
172 #define PAGE_FLAGS_VALID_FOR_SECTION \
177 PAGE_EXECUTE_READ | \
178 PAGE_EXECUTE_READWRITE | \
179 PAGE_EXECUTE_WRITECOPY | \
182 #define PAGE_IS_READABLE \
186 PAGE_EXECUTE_READ | \
187 PAGE_EXECUTE_READWRITE | \
188 PAGE_EXECUTE_WRITECOPY)
190 #define PAGE_IS_WRITABLE \
193 PAGE_EXECUTE_READWRITE | \
194 PAGE_EXECUTE_WRITECOPY)
196 #define PAGE_IS_EXECUTABLE \
198 PAGE_EXECUTE_READ | \
199 PAGE_EXECUTE_READWRITE | \
200 PAGE_EXECUTE_WRITECOPY)
202 #define PAGE_IS_WRITECOPY \
204 PAGE_EXECUTE_WRITECOPY)
206 #define MI_PFN_ELEMENT(Pfn) (&MmPfnDatabase[Pfn])
208 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
209 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
211 #define InterlockedExchangePte(PointerPte, Value) \
212 InterlockedExchange((PLONG)(PointerPte), Value)
216 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
217 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
221 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
222 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
224 typedef struct _MM_SECTION_SEGMENT
226 LONG FileOffset
; /* start offset into the file for image sections */
227 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
228 ULONG RawLength
; /* length of the segment which is part of the mapped file */
229 ULONG Length
; /* absolute length of the segment */
231 FAST_MUTEX Lock
; /* lock which protects the page directory */
232 ULONG ReferenceCount
;
233 SECTION_PAGE_DIRECTORY PageDirectory
;
235 ULONG Characteristics
;
237 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
239 typedef struct _MM_IMAGE_SECTION_OBJECT
242 ULONG_PTR StackReserve
;
243 ULONG_PTR StackCommit
;
244 ULONG_PTR EntryPoint
;
246 USHORT ImageCharacteristics
;
247 USHORT MinorSubsystemVersion
;
248 USHORT MajorSubsystemVersion
;
253 PMM_SECTION_SEGMENT Segments
;
254 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
256 typedef struct _ROS_SECTION_OBJECT
260 LARGE_INTEGER MaximumSize
;
261 ULONG SectionPageProtection
;
262 ULONG AllocationAttributes
;
263 PFILE_OBJECT FileObject
;
266 PMM_IMAGE_SECTION_OBJECT ImageSection
;
267 PMM_SECTION_SEGMENT Segment
;
269 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
271 typedef struct _MEMORY_AREA
273 PVOID StartingAddress
;
275 struct _MEMORY_AREA
*Parent
;
276 struct _MEMORY_AREA
*LeftChild
;
277 struct _MEMORY_AREA
*RightChild
;
281 BOOLEAN DeleteInProgress
;
287 ROS_SECTION_OBJECT
* Section
;
289 PMM_SECTION_SEGMENT Segment
;
290 BOOLEAN WriteCopyView
;
291 LIST_ENTRY RegionListHead
;
295 LIST_ENTRY RegionListHead
;
298 } MEMORY_AREA
, *PMEMORY_AREA
;
301 // These two mappings are actually used by Windows itself, based on the ASSERTS
303 #define StartOfAllocation ReadInProgress
304 #define EndOfAllocation WriteInProgress
306 typedef struct _MMPFNENTRY
309 USHORT ReadInProgress
:1; // StartOfAllocation
310 USHORT WriteInProgress
:1; // EndOfAllocation
311 USHORT PrototypePte
:1; // Zero
312 USHORT PageColor
:4; // LockCount
313 USHORT PageLocation
:3; // Consumer
314 USHORT RemovalRequested
:1;
315 USHORT CacheAttribute
:2; // Type
317 USHORT ParityError
:1;
320 typedef struct _MMPFN
324 PFN_NUMBER Flink
; // ListEntry.Flink
328 SINGLE_LIST_ENTRY NextStackPfn
;
330 PMMPTE PteAddress
; // ListEntry.Blink
334 ULONG_PTR ShareCount
; // MapCount
340 USHORT ReferenceCount
; // ReferenceCount
345 USHORT ReferenceCount
;
350 ULONG UsedPageTableEntries
;
355 LONG AweReferenceCount
; // RmapListHead
359 ULONG_PTR EntireFrame
; // SavedSwapEntry
362 ULONG_PTR PteFrame
: 8*sizeof(PVOID
)-7;
363 ULONG_PTR InPageError
:1;
364 ULONG_PTR VerifierAllocation
:1;
365 ULONG_PTR AweAllocation
:1;
366 ULONG_PTR Priority
:3;
367 ULONG_PTR MustBeCached
:1;
372 extern PMMPFN MmPfnDatabase
[2];
374 typedef struct _MMPFNLIST
380 } MMPFNLIST
, *PMMPFNLIST
;
382 extern MMPFNLIST MmZeroedPageListHead
;
383 extern MMPFNLIST MmFreePageListHead
;
384 extern MMPFNLIST MmStandbyPageListHead
;
385 extern MMPFNLIST MmModifiedPageListHead
;
386 extern MMPFNLIST MmModifiedNoWritePageListHead
;
388 typedef struct _MM_PAGEOP
390 /* Type of operation. */
392 /* Number of threads interested in this operation. */
393 ULONG ReferenceCount
;
394 /* Event that will be set when the operation is completed. */
395 KEVENT CompletionEvent
;
396 /* Status of the operation once it is completed. */
398 /* TRUE if the operation was abandoned. */
400 /* The memory area to be affected by the operation. */
403 struct _MM_PAGEOP
* Next
;
404 struct _ETHREAD
* Thread
;
406 * These fields are used to identify the operation if it is against a
407 * virtual memory area.
412 * These fields are used to identify the operation if it is against a
415 PMM_SECTION_SEGMENT Segment
;
417 } MM_PAGEOP
, *PMM_PAGEOP
;
419 typedef struct _MM_MEMORY_CONSUMER
423 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
424 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
426 typedef struct _MM_REGION
431 LIST_ENTRY RegionListEntry
;
432 } MM_REGION
, *PMM_REGION
;
434 /* Entry describing free pool memory */
435 typedef struct _MMFREE_POOL_ENTRY
440 struct _MMFREE_POOL_ENTRY
*Owner
;
441 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
443 /* Paged pool information */
444 typedef struct _MM_PAGED_POOL_INFO
446 PRTL_BITMAP PagedPoolAllocationMap
;
447 PRTL_BITMAP EndOfPagedPoolBitmap
;
448 PMMPTE FirstPteForPagedPool
;
449 PMMPTE LastPteForPagedPool
;
450 PMMPTE NextPdeForPagedPoolExpansion
;
452 SIZE_T PagedPoolCommit
;
453 SIZE_T AllocatedPagedPool
;
454 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
456 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
459 (*PMM_ALTER_REGION_FUNC
)(
460 PMMSUPPORT AddressSpace
,
470 (*PMM_FREE_PAGE_FUNC
)(
472 PMEMORY_AREA MemoryArea
,
480 // Mm copy support for Kd
492 // Determines if a given address is a session address
500 /* marea.c *******************************************************************/
505 PMMSUPPORT AddressSpace
,
510 PMEMORY_AREA
*Result
,
511 BOOLEAN FixedAddress
,
512 ULONG AllocationFlags
,
513 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
518 MmLocateMemoryAreaByAddress(
519 PMMSUPPORT AddressSpace
,
526 PMMSUPPORT AddressSpace
,
533 PMMSUPPORT AddressSpace
,
534 PMEMORY_AREA MemoryArea
,
535 PMM_FREE_PAGE_FUNC FreePage
,
536 PVOID FreePageContext
541 MmFreeMemoryAreaByPtr(
542 PMMSUPPORT AddressSpace
,
544 PMM_FREE_PAGE_FUNC FreePage
,
545 PVOID FreePageContext
550 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
554 MmLocateMemoryAreaByRegion(
555 PMMSUPPORT AddressSpace
,
563 PMMSUPPORT AddressSpace
,
565 ULONG_PTR Granularity
,
571 MmReleaseMemoryAreaIfDecommitted(
572 struct _EPROCESS
*Process
,
573 PMMSUPPORT AddressSpace
,
579 MmMapMemoryArea(PVOID BaseAddress
,
584 /* npool.c *******************************************************************/
588 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
592 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
596 MiInitializeNonPagedPool(VOID
);
601 IN POOL_TYPE PoolType
,
602 IN SIZE_T SizeInBytes
608 IN PVOID VirtualAddress
614 IN PVOID StartingAddress
624 /* pool.c *******************************************************************/
628 ExAllocateNonPagedPoolWithTag(
637 ExAllocatePagedPoolWithTag(
645 ExFreeNonPagedPool(PVOID block
);
649 ExFreePagedPool(IN PVOID Block
);
653 ExpIsPoolTagDebuggable(ULONG Tag
);
657 ExpAllocateDebugPool(
667 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
671 MmInitializePagedPool(VOID
);
675 MiAllocateSpecialPool(
676 IN POOL_TYPE PoolType
,
677 IN SIZE_T NumberOfBytes
,
685 IN POOL_TYPE PoolType
,
686 IN ULONG CurrentMaxQuota
,
687 OUT PULONG NewMaxQuota
690 /* mdl.c *********************************************************************/
699 /* mminit.c ******************************************************************/
703 MiShutdownMemoryManager(VOID
);
713 MmInitSystem(IN ULONG Phase
,
714 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
718 MiFreeInitMemory(VOID
);
722 MmInitializeMdlImplementation(VOID
);
724 /* pagefile.c ****************************************************************/
728 MmAllocSwapPage(VOID
);
732 MmDereserveSwapPages(ULONG Nr
);
736 MmFreeSwapPage(SWAPENTRY Entry
);
740 MmInitPagingFile(VOID
);
751 MmReserveSwapPages(ULONG Nr
);
764 ULONG BugCodeParameter1
,
765 ULONG BugCodeParameter2
,
766 ULONG BugCodeParameter3
,
767 ULONG BugCodeParameter4
,
768 struct _KTRAP_FRAME
* TrapFrame
773 MmIsAvailableSwapPage(VOID
);
777 MmShowOutOfSpaceMessagePagingFile(VOID
);
779 /* process.c ****************************************************************/
783 MmInitializeProcessAddressSpace(
784 IN PEPROCESS Process
,
785 IN PEPROCESS Clone OPTIONAL
,
786 IN PVOID Section OPTIONAL
,
788 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
794 IN PEPROCESS Process
,
795 IN PINITIAL_PEB InitialPeb
,
802 IN PEPROCESS Process
,
803 IN PCLIENT_ID ClientId
,
804 IN PINITIAL_TEB InitialTeb
,
811 struct _EPROCESS
*Process
,
817 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
821 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
825 MmGetSessionLocaleId(VOID
);
829 MmSetMemoryPriorityProcess(
830 IN PEPROCESS Process
,
831 IN UCHAR MemoryPriority
834 /* i386/pfault.c *************************************************************/
846 /* mm.c **********************************************************************/
851 IN BOOLEAN StoreInstruction
,
853 IN KPROCESSOR_MODE Mode
,
854 IN PVOID TrapInformation
857 /* anonmem.c *****************************************************************/
861 MmNotPresentFaultVirtualMemory(
862 PMMSUPPORT AddressSpace
,
863 MEMORY_AREA
* MemoryArea
,
870 MmPageOutVirtualMemory(
871 PMMSUPPORT AddressSpace
,
872 PMEMORY_AREA MemoryArea
,
874 struct _MM_PAGEOP
* PageOp
880 PMEMORY_AREA MemoryArea
,
882 PMEMORY_BASIC_INFORMATION Info
,
889 struct _EPROCESS
* Process
,
890 PMEMORY_AREA MemoryArea
896 PMMSUPPORT AddressSpace
,
897 PMEMORY_AREA MemoryArea
,
906 MmWritePageVirtualMemory(
907 PMMSUPPORT AddressSpace
,
913 /* kmap.c ********************************************************************/
917 ExAllocatePage(VOID
);
921 ExUnmapPage(PVOID Addr
);
925 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
936 MiZeroPage(PFN_NUMBER Page
);
938 /* memsafe.s *****************************************************************/
942 MmSafeReadPtr(PVOID Source
);
944 /* pageop.c ******************************************************************/
948 MmReleasePageOp(PMM_PAGEOP PageOp
);
956 PMM_SECTION_SEGMENT Segment
,
968 PMM_SECTION_SEGMENT Segment
,
974 MmInitializePageOp(VOID
);
976 /* process.c *****************************************************************/
980 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
984 MmDeleteKernelStack(PVOID Stack
,
987 /* balace.c ******************************************************************/
991 MmInitializeMemoryConsumer(
993 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
998 MmInitializeBalancer(
999 ULONG NrAvailablePages
,
1005 MmReleasePageMemoryConsumer(
1012 MmRequestPageMemoryConsumer(
1015 PPFN_NUMBER AllocatedPage
1020 MiInitBalancerThread(VOID
);
1024 MmRebalanceMemoryConsumers(VOID
);
1026 /* rmap.c **************************************************************/
1030 MmSetRmapListHeadPage(
1032 struct _MM_RMAP_ENTRY
* ListHead
1035 struct _MM_RMAP_ENTRY
*
1037 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1043 struct _EPROCESS
*Process
,
1052 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1059 struct _EPROCESS
*Process
,
1065 MmInitializeRmapList(VOID
);
1069 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1073 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1077 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1081 MmWritePagePhysicalAddress(PFN_NUMBER Page
);
1085 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1087 /* freelist.c **********************************************************/
1091 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1094 extern RTL_BITMAP MiPfnBitMap
;
1096 /* Make sure the PFN number is valid */
1097 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1099 /* Make sure this page actually has a PFN entry */
1100 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, Pfn
))) return NULL
;
1103 Page
= &MmPfnDatabase
[0][Pfn
];
1111 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1114 // This will return the Page Frame Number (PFN) from the MMPFN
1116 return Pfn1
- MmPfnDatabase
[0];
1121 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1125 MmGetLRUFirstUserPage(VOID
);
1129 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1133 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1137 MmLockPage(PFN_NUMBER Page
);
1141 MmUnlockPage(PFN_NUMBER Page
);
1145 MmGetLockCountPage(PFN_NUMBER Page
);
1149 MmInitializePageList(
1161 MmGetContinuousPages(
1162 ULONG NumberOfBytes
,
1163 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1164 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1165 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1171 MmZeroPageThreadMain(
1175 /* hypermap.c *****************************************************************/
1177 extern PEPROCESS HyperProcess
;
1178 extern KIRQL HyperIrql
;
1182 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1188 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1194 MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER
*Pages
,
1195 IN PFN_NUMBER NumberOfPages
);
1199 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1200 IN PFN_NUMBER NumberOfPages
);
1203 // ReactOS Compatibility Layer
1207 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1209 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1210 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1215 MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page
)
1217 return MiMapPagesToZeroInHyperSpace(&Page
, 1);
1220 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1222 /* i386/page.c *********************************************************/
1226 MmCreateVirtualMappingForKernel(
1235 MmCommitPagedPoolAddress(
1242 MmCreateVirtualMapping(
1243 struct _EPROCESS
* Process
,
1252 MmCreateVirtualMappingUnsafe(
1253 struct _EPROCESS
* Process
,
1263 struct _EPROCESS
* Process
,
1269 struct _EPROCESS
* Process
,
1277 struct _EPROCESS
* Process
,
1283 MmInitGlobalKernelPageDirectory(VOID
);
1287 MmDisableVirtualMapping(
1288 struct _EPROCESS
*Process
,
1296 MmEnableVirtualMapping(
1297 struct _EPROCESS
*Process
,
1303 MmRawDeleteVirtualMapping(PVOID Address
);
1307 MmDeletePageFileMapping(
1308 struct _EPROCESS
*Process
,
1310 SWAPENTRY
* SwapEntry
1315 MmCreatePageFileMapping(
1316 struct _EPROCESS
*Process
,
1324 struct _EPROCESS
*Process
,
1330 MmTransferOwnershipPage(
1338 struct _EPROCESS
*Process
,
1350 MmAllocPagesSpecifyRange(
1352 PHYSICAL_ADDRESS LowestAddress
,
1353 PHYSICAL_ADDRESS HighestAddress
,
1354 ULONG NumberOfPages
,
1360 MmDereferencePage(PFN_NUMBER Page
);
1364 MmReferencePage(PFN_NUMBER Page
);
1368 MmGetReferenceCountPage(PFN_NUMBER Page
);
1372 MmIsPageInUse(PFN_NUMBER Page
);
1376 MmSetSavedSwapEntryPage(
1378 SWAPENTRY SavedSwapEntry
);
1382 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1387 struct _EPROCESS
*Process
,
1393 MmCreatePageTable(PVOID PAddress
);
1398 struct _EPROCESS
*Process
,
1405 struct _EPROCESS
*Process
,
1411 MmCreateProcessAddressSpace(
1414 IN PULONG_PTR DirectoryTableBase
1419 MmInitializeHandBuiltProcess(
1420 IN PEPROCESS Process
,
1421 IN PULONG_PTR DirectoryTableBase
1427 MmInitializeHandBuiltProcess2(
1428 IN PEPROCESS Process
1433 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1437 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1441 MmDeleteVirtualMapping(
1442 struct _EPROCESS
*Process
,
1452 struct _EPROCESS
*Process
,
1458 MmMarkPageMapped(PFN_NUMBER Page
);
1462 MmMarkPageUnmapped(PFN_NUMBER Page
);
1467 struct _EPROCESS
*Process
,
1474 MiInitPageDirectoryMap(VOID
);
1478 MiGetUserPageDirectoryCount(VOID
);
1480 /* wset.c ********************************************************************/
1489 /* region.c ************************************************************/
1494 PMMSUPPORT AddressSpace
,
1496 PLIST_ENTRY RegionListHead
,
1501 PMM_ALTER_REGION_FUNC AlterFunc
1507 PLIST_ENTRY RegionListHead
,
1517 PLIST_ENTRY RegionListHead
,
1519 PVOID
* RegionBaseAddress
1522 /* section.c *****************************************************************/
1526 MmGetFileObjectForSection(
1527 IN PROS_SECTION_OBJECT Section
1531 MmGetFileNameForAddress(
1533 OUT PUNICODE_STRING ModuleName
1538 MmGetFileNameForSection(
1539 IN PROS_SECTION_OBJECT Section
,
1540 OUT POBJECT_NAME_INFORMATION
*ModuleName
1559 PMEMORY_AREA MemoryArea
,
1561 PMEMORY_BASIC_INFORMATION Info
,
1562 PSIZE_T ResultLength
1567 MmProtectSectionView(
1568 PMMSUPPORT AddressSpace
,
1569 PMEMORY_AREA MemoryArea
,
1578 MmWritePageSectionView(
1579 PMMSUPPORT AddressSpace
,
1587 MmInitSectionImplementation(VOID
);
1591 MmNotPresentFaultSectionView(
1592 PMMSUPPORT AddressSpace
,
1593 MEMORY_AREA
* MemoryArea
,
1600 MmPageOutSectionView(
1601 PMMSUPPORT AddressSpace
,
1602 PMEMORY_AREA MemoryArea
,
1604 struct _MM_PAGEOP
*PageOp
1609 MmCreatePhysicalMemorySection(VOID
);
1613 MmAccessFaultSectionView(
1614 PMMSUPPORT AddressSpace
,
1615 MEMORY_AREA
* MemoryArea
,
1622 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1624 /* mpw.c *********************************************************************/
1628 MmInitMpwThread(VOID
);
1632 MmInitBsmThread(VOID
);
1634 /* pager.c *******************************************************************/
1638 MiIsPagerThread(VOID
);
1642 MiStartPagerThread(VOID
);
1646 MiStopPagerThread(VOID
);
1650 MiQueryVirtualMemory(
1651 IN HANDLE ProcessHandle
,
1653 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1654 OUT PVOID VirtualMemoryInformation
,
1656 OUT PSIZE_T ResultLength
1659 /* sysldr.c ******************************************************************/
1663 MiReloadBootLoadedDrivers(
1664 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1669 MiInitializeLoadedModuleList(
1670 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1676 IN PUNICODE_STRING FileName
,
1677 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1678 IN PUNICODE_STRING LoadedName OPTIONAL
,
1680 OUT PVOID
*ModuleObject
,
1681 OUT PVOID
*ImageBaseAddress
1686 MmUnloadSystemImage(
1687 IN PVOID ImageHandle
1693 IN HANDLE ImageHandle
,
1694 IN BOOLEAN PurgeSection
1699 MmCallDllInitialize(
1700 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1701 IN PLIST_ENTRY ListHead
1704 /* ReactOS Mm Hacks */
1707 MiSyncForProcessAttach(
1708 IN PKTHREAD NextThread
,
1709 IN PEPROCESS Process
1714 MiSyncForContextSwitch(
1718 extern PMMSUPPORT MmKernelAddressSpace
;
1722 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1724 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1729 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1731 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1736 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1738 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1739 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1744 MmGetCurrentAddressSpace(VOID
)
1746 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1751 MmGetKernelAddressSpace(VOID
)
1753 return MmKernelAddressSpace
;