3 #include <internal/arch/mm.h>
5 /* TYPES *********************************************************************/
9 extern PFN_NUMBER MiFreeSwapPages
;
10 extern PFN_NUMBER MiUsedSwapPages
;
11 extern SIZE_T MmTotalPagedPoolQuota
;
12 extern SIZE_T MmTotalNonPagedPoolQuota
;
13 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
14 extern PFN_NUMBER MmNumberOfPhysicalPages
;
15 extern UCHAR MmDisablePagingExecutive
;
16 extern PFN_NUMBER MmLowestPhysicalPage
;
17 extern PFN_NUMBER MmHighestPhysicalPage
;
18 extern PFN_NUMBER MmAvailablePages
;
19 extern PFN_NUMBER MmResidentAvailablePages
;
21 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
22 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
24 extern LIST_ENTRY MmLoadedUserImageList
;
26 extern KMUTANT MmSystemLoadLock
;
28 extern ULONG MmNumberOfPagingFiles
;
30 extern PVOID MmUnloadedDrivers
;
31 extern PVOID MmLastUnloadedDrivers
;
32 extern PVOID MmTriageActionTaken
;
33 extern PVOID KernelVerifier
;
34 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
36 extern SIZE_T MmTotalCommitLimit
;
37 extern SIZE_T MmTotalCommittedPages
;
38 extern SIZE_T MmSharedCommit
;
39 extern SIZE_T MmDriverCommit
;
40 extern SIZE_T MmProcessCommit
;
41 extern SIZE_T MmPagedPoolCommit
;
42 extern SIZE_T MmPeakCommitment
;
43 extern SIZE_T MmtotalCommitLimitMaximum
;
45 extern PVOID MiDebugMapping
;
46 extern PMMPTE MmDebugPte
;
50 struct _MM_RMAP_ENTRY
;
52 typedef ULONG SWAPENTRY
;
55 // MmDbgCopyMemory Flags
57 #define MMDBG_COPY_WRITE 0x00000001
58 #define MMDBG_COPY_PHYSICAL 0x00000002
59 #define MMDBG_COPY_UNSAFE 0x00000004
60 #define MMDBG_COPY_CACHED 0x00000008
61 #define MMDBG_COPY_UNCACHED 0x00000010
62 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
65 // Maximum chunk size per copy
67 #define MMDBG_COPY_MAX_SIZE 0x8
70 #define MI_STATIC_MEMORY_AREAS (14)
72 #define MI_STATIC_MEMORY_AREAS (13)
75 #define MEMORY_AREA_SECTION_VIEW (1)
76 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
77 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
78 #define MEMORY_AREA_STATIC (0x80000000)
80 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
82 #define MM_CORE_DUMP_TYPE_NONE (0x0)
83 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
84 #define MM_CORE_DUMP_TYPE_FULL (0x2)
86 #define MM_PAGEOP_PAGEIN (1)
87 #define MM_PAGEOP_PAGEOUT (2)
88 #define MM_PAGEOP_PAGESYNCH (3)
89 #define MM_PAGEOP_ACCESSFAULT (4)
91 /* Number of list heads to use */
92 #define MI_FREE_POOL_LISTS 4
95 /* Signature of free pool blocks */
96 #define MM_FREE_POOL_TAG 'lprF'
98 /* Although Microsoft says this isn't hardcoded anymore,
99 they won't be able to change it. Stuff depends on it */
100 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
102 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
105 * Additional flags for protection attributes
107 #define PAGE_WRITETHROUGH (1024)
108 #define PAGE_SYSTEM (2048)
110 #define SEC_PHYSICALMEMORY (0x80000000)
112 #define MM_PAGEFILE_SEGMENT (0x1)
113 #define MM_DATAFILE_SEGMENT (0x2)
117 #define MC_SYSTEM (2)
118 #define MC_MAXIMUM (3)
120 #define PAGED_POOL_MASK 1
121 #define MUST_SUCCEED_POOL_MASK 2
122 #define CACHE_ALIGNED_POOL_MASK 4
123 #define QUOTA_POOL_MASK 8
124 #define SESSION_POOL_MASK 32
125 #define VERIFIER_POOL_MASK 64
127 #define MM_PAGED_POOL_SIZE (100*1024*1024)
128 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
131 * Paged and non-paged pools are 8-byte aligned
133 #define MM_POOL_ALIGNMENT 8
135 #define MM_ROUND_UP(x,s) \
136 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
138 #define MM_ROUND_DOWN(x,s) \
139 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
141 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
146 PAGE_EXECUTE_READ | \
147 PAGE_EXECUTE_READWRITE | \
148 PAGE_EXECUTE_WRITECOPY | \
153 #define PAGE_FLAGS_VALID_FOR_SECTION \
158 PAGE_EXECUTE_READ | \
159 PAGE_EXECUTE_READWRITE | \
160 PAGE_EXECUTE_WRITECOPY | \
163 #define PAGE_IS_READABLE \
167 PAGE_EXECUTE_READ | \
168 PAGE_EXECUTE_READWRITE | \
169 PAGE_EXECUTE_WRITECOPY)
171 #define PAGE_IS_WRITABLE \
174 PAGE_EXECUTE_READWRITE | \
175 PAGE_EXECUTE_WRITECOPY)
177 #define PAGE_IS_EXECUTABLE \
179 PAGE_EXECUTE_READ | \
180 PAGE_EXECUTE_READWRITE | \
181 PAGE_EXECUTE_WRITECOPY)
183 #define PAGE_IS_WRITECOPY \
185 PAGE_EXECUTE_WRITECOPY)
188 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
189 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
191 #define InterlockedExchangePte(PointerPte, Value) \
192 InterlockedExchange((PLONG)(PointerPte), Value)
196 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
197 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
201 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
202 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
204 typedef struct _MM_SECTION_SEGMENT
206 LONG FileOffset
; /* start offset into the file for image sections */
207 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
208 ULONG RawLength
; /* length of the segment which is part of the mapped file */
209 ULONG Length
; /* absolute length of the segment */
211 FAST_MUTEX Lock
; /* lock which protects the page directory */
212 ULONG ReferenceCount
;
213 SECTION_PAGE_DIRECTORY PageDirectory
;
215 ULONG Characteristics
;
217 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
219 typedef struct _MM_IMAGE_SECTION_OBJECT
222 ULONG_PTR StackReserve
;
223 ULONG_PTR StackCommit
;
224 ULONG_PTR EntryPoint
;
226 USHORT ImageCharacteristics
;
227 USHORT MinorSubsystemVersion
;
228 USHORT MajorSubsystemVersion
;
233 PMM_SECTION_SEGMENT Segments
;
234 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
236 typedef struct _ROS_SECTION_OBJECT
240 LARGE_INTEGER MaximumSize
;
241 ULONG SectionPageProtection
;
242 ULONG AllocationAttributes
;
243 PFILE_OBJECT FileObject
;
246 PMM_IMAGE_SECTION_OBJECT ImageSection
;
247 PMM_SECTION_SEGMENT Segment
;
249 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
251 typedef struct _MEMORY_AREA
253 PVOID StartingAddress
;
255 struct _MEMORY_AREA
*Parent
;
256 struct _MEMORY_AREA
*LeftChild
;
257 struct _MEMORY_AREA
*RightChild
;
261 BOOLEAN DeleteInProgress
;
268 ROS_SECTION_OBJECT
* Section
;
270 PMM_SECTION_SEGMENT Segment
;
271 LIST_ENTRY RegionListHead
;
275 LIST_ENTRY RegionListHead
;
278 } MEMORY_AREA
, *PMEMORY_AREA
;
280 typedef struct _MM_RMAP_ENTRY
282 struct _MM_RMAP_ENTRY
* Next
;
289 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
292 // These two mappings are actually used by Windows itself, based on the ASSERTS
294 #define StartOfAllocation ReadInProgress
295 #define EndOfAllocation WriteInProgress
297 typedef struct _MMPFNENTRY
300 USHORT ReadInProgress
:1; // StartOfAllocation
301 USHORT WriteInProgress
:1; // EndOfAllocation
302 USHORT PrototypePte
:1;
304 USHORT PageLocation
:3;
305 USHORT RemovalRequested
:1;
306 USHORT CacheAttribute
:2;
308 USHORT ParityError
:1; // HasRmap
311 typedef struct _MMPFN
316 ULONG WsIndex
; // SavedSwapEntry
319 SINGLE_LIST_ENTRY NextStackPfn
;
325 ULONG_PTR ShareCount
;
331 USHORT ReferenceCount
; // ReferenceCount
336 USHORT ReferenceCount
;
343 LONG AweReferenceCount
; // RmapListHead
347 ULONG_PTR EntireFrame
;
350 ULONG_PTR PteFrame
:25;
351 ULONG_PTR InPageError
:1;
352 ULONG_PTR VerifierAllocation
:1;
353 ULONG_PTR AweAllocation
:1;
354 ULONG_PTR Priority
:3;
355 ULONG_PTR MustBeCached
:1;
360 extern PMMPFN MmPfnDatabase
;
362 typedef struct _MMPFNLIST
368 } MMPFNLIST
, *PMMPFNLIST
;
370 extern MMPFNLIST MmZeroedPageListHead
;
371 extern MMPFNLIST MmFreePageListHead
;
372 extern MMPFNLIST MmStandbyPageListHead
;
373 extern MMPFNLIST MmModifiedPageListHead
;
374 extern MMPFNLIST MmModifiedNoWritePageListHead
;
376 typedef struct _MM_PAGEOP
378 /* Type of operation. */
380 /* Number of threads interested in this operation. */
381 ULONG ReferenceCount
;
382 /* Event that will be set when the operation is completed. */
383 KEVENT CompletionEvent
;
384 /* Status of the operation once it is completed. */
386 /* TRUE if the operation was abandoned. */
388 /* The memory area to be affected by the operation. */
391 struct _MM_PAGEOP
* Next
;
392 struct _ETHREAD
* Thread
;
394 * These fields are used to identify the operation if it is against a
395 * virtual memory area.
400 * These fields are used to identify the operation if it is against a
403 PMM_SECTION_SEGMENT Segment
;
405 } MM_PAGEOP
, *PMM_PAGEOP
;
407 typedef struct _MM_MEMORY_CONSUMER
411 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
412 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
414 typedef struct _MM_REGION
419 LIST_ENTRY RegionListEntry
;
420 } MM_REGION
, *PMM_REGION
;
422 /* Entry describing free pool memory */
423 typedef struct _MMFREE_POOL_ENTRY
428 struct _MMFREE_POOL_ENTRY
*Owner
;
429 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
431 /* Signature of a freed block */
432 #define MM_FREE_POOL_SIGNATURE 'ARM3'
434 /* Paged pool information */
435 typedef struct _MM_PAGED_POOL_INFO
437 PRTL_BITMAP PagedPoolAllocationMap
;
438 PRTL_BITMAP EndOfPagedPoolBitmap
;
439 PMMPTE FirstPteForPagedPool
;
440 PMMPTE LastPteForPagedPool
;
441 PMMPTE NextPdeForPagedPoolExpansion
;
443 SIZE_T PagedPoolCommit
;
444 SIZE_T AllocatedPagedPool
;
445 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
447 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
450 (*PMM_ALTER_REGION_FUNC
)(
451 PMMSUPPORT AddressSpace
,
461 (*PMM_FREE_PAGE_FUNC
)(
463 PMEMORY_AREA MemoryArea
,
471 // Mm copy support for Kd
483 // Determines if a given address is a session address
491 /* marea.c *******************************************************************/
496 PMMSUPPORT AddressSpace
,
501 PMEMORY_AREA
*Result
,
502 BOOLEAN FixedAddress
,
503 ULONG AllocationFlags
,
504 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
509 MmLocateMemoryAreaByAddress(
510 PMMSUPPORT AddressSpace
,
517 PMMSUPPORT AddressSpace
,
524 PMMSUPPORT AddressSpace
,
525 PMEMORY_AREA MemoryArea
,
526 PMM_FREE_PAGE_FUNC FreePage
,
527 PVOID FreePageContext
532 MmFreeMemoryAreaByPtr(
533 PMMSUPPORT AddressSpace
,
535 PMM_FREE_PAGE_FUNC FreePage
,
536 PVOID FreePageContext
541 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
545 MmLocateMemoryAreaByRegion(
546 PMMSUPPORT AddressSpace
,
554 PMMSUPPORT AddressSpace
,
556 ULONG_PTR Granularity
,
562 MmReleaseMemoryAreaIfDecommitted(
563 struct _EPROCESS
*Process
,
564 PMMSUPPORT AddressSpace
,
570 MmMapMemoryArea(PVOID BaseAddress
,
575 /* npool.c *******************************************************************/
579 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
583 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
587 MiInitializeNonPagedPool(VOID
);
592 IN POOL_TYPE PoolType
,
593 IN SIZE_T SizeInBytes
599 IN PVOID VirtualAddress
605 IN PVOID StartingAddress
615 /* pool.c *******************************************************************/
619 ExAllocateNonPagedPoolWithTag(
628 ExAllocatePagedPoolWithTag(
636 ExFreeNonPagedPool(PVOID block
);
640 ExFreePagedPool(IN PVOID Block
);
644 ExpIsPoolTagDebuggable(ULONG Tag
);
648 ExpAllocateDebugPool(
658 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
662 MmInitializePagedPool(VOID
);
666 MiAllocateSpecialPool(
667 IN POOL_TYPE PoolType
,
668 IN SIZE_T NumberOfBytes
,
676 IN POOL_TYPE PoolType
,
677 IN ULONG CurrentMaxQuota
,
678 OUT PULONG NewMaxQuota
681 /* mdl.c *********************************************************************/
690 /* mminit.c ******************************************************************/
694 MiShutdownMemoryManager(VOID
);
704 MmInitSystem(IN ULONG Phase
,
705 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
709 MiFreeInitMemory(VOID
);
713 MmInitializeMdlImplementation(VOID
);
715 /* pagefile.c ****************************************************************/
719 MmAllocSwapPage(VOID
);
723 MmDereserveSwapPages(ULONG Nr
);
727 MmFreeSwapPage(SWAPENTRY Entry
);
731 MmInitPagingFile(VOID
);
742 MmReserveSwapPages(ULONG Nr
);
755 ULONG BugCodeParameter1
,
756 ULONG BugCodeParameter2
,
757 ULONG BugCodeParameter3
,
758 ULONG BugCodeParameter4
,
759 struct _KTRAP_FRAME
* TrapFrame
764 MmIsAvailableSwapPage(VOID
);
768 MmShowOutOfSpaceMessagePagingFile(VOID
);
770 /* process.c ****************************************************************/
774 MmInitializeProcessAddressSpace(
775 IN PEPROCESS Process
,
776 IN PEPROCESS Clone OPTIONAL
,
777 IN PVOID Section OPTIONAL
,
779 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
785 IN PEPROCESS Process
,
786 IN PINITIAL_PEB InitialPeb
,
793 IN PEPROCESS Process
,
794 IN PCLIENT_ID ClientId
,
795 IN PINITIAL_TEB InitialTeb
,
802 struct _EPROCESS
*Process
,
808 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
812 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
816 MmGetSessionLocaleId(VOID
);
820 MmSetMemoryPriorityProcess(
821 IN PEPROCESS Process
,
822 IN UCHAR MemoryPriority
825 /* i386/pfault.c *************************************************************/
837 /* mm.c **********************************************************************/
842 IN BOOLEAN StoreInstruction
,
844 IN KPROCESSOR_MODE Mode
,
845 IN PVOID TrapInformation
848 /* anonmem.c *****************************************************************/
852 MmNotPresentFaultVirtualMemory(
853 PMMSUPPORT AddressSpace
,
854 MEMORY_AREA
* MemoryArea
,
861 MmPageOutVirtualMemory(
862 PMMSUPPORT AddressSpace
,
863 PMEMORY_AREA MemoryArea
,
865 struct _MM_PAGEOP
* PageOp
871 PMEMORY_AREA MemoryArea
,
873 PMEMORY_BASIC_INFORMATION Info
,
880 struct _EPROCESS
* Process
,
881 PMEMORY_AREA MemoryArea
887 PMMSUPPORT AddressSpace
,
888 PMEMORY_AREA MemoryArea
,
897 MmWritePageVirtualMemory(
898 PMMSUPPORT AddressSpace
,
904 /* kmap.c ********************************************************************/
908 ExAllocatePage(VOID
);
912 ExUnmapPage(PVOID Addr
);
916 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
927 MiZeroPage(PFN_NUMBER Page
);
929 /* memsafe.s *****************************************************************/
933 MmSafeReadPtr(PVOID Source
);
935 /* pageop.c ******************************************************************/
939 MmReleasePageOp(PMM_PAGEOP PageOp
);
947 PMM_SECTION_SEGMENT Segment
,
959 PMM_SECTION_SEGMENT Segment
,
965 MmInitializePageOp(VOID
);
967 /* process.c *****************************************************************/
971 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
975 MmDeleteKernelStack(PVOID Stack
,
978 /* balace.c ******************************************************************/
982 MmInitializeMemoryConsumer(
984 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
989 MmInitializeBalancer(
990 ULONG NrAvailablePages
,
996 MmReleasePageMemoryConsumer(
1003 MmRequestPageMemoryConsumer(
1006 PPFN_NUMBER AllocatedPage
1011 MiInitBalancerThread(VOID
);
1015 MmRebalanceMemoryConsumers(VOID
);
1017 /* rmap.c **************************************************************/
1021 MmSetRmapListHeadPage(
1023 struct _MM_RMAP_ENTRY
* ListHead
1026 struct _MM_RMAP_ENTRY
*
1028 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1034 struct _EPROCESS
*Process
,
1043 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1050 struct _EPROCESS
*Process
,
1056 MmInitializeRmapList(VOID
);
1060 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1064 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1068 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1072 MmWritePagePhysicalAddress(PFN_NUMBER Page
);
1076 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1078 /* freelist.c **********************************************************/
1082 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1085 extern RTL_BITMAP MiPfnBitMap
;
1087 /* Make sure the PFN number is valid */
1088 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1090 /* Make sure this page actually has a PFN entry */
1091 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, Pfn
))) return NULL
;
1094 Page
= &MmPfnDatabase
[Pfn
];
1102 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1105 // This will return the Page Frame Number (PFN) from the MMPFN
1107 return Pfn1
- MmPfnDatabase
;
1112 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1116 MmGetLRUFirstUserPage(VOID
);
1120 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1124 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1128 MmLockPage(PFN_NUMBER Page
);
1132 MmUnlockPage(PFN_NUMBER Page
);
1136 MmGetLockCountPage(PFN_NUMBER Page
);
1140 MmInitializePageList(
1152 MmGetContinuousPages(
1153 ULONG NumberOfBytes
,
1154 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1155 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1156 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1166 /* hypermap.c *****************************************************************/
1168 extern PEPROCESS HyperProcess
;
1169 extern KIRQL HyperIrql
;
1173 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1179 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1185 MiMapPagesToZeroInHyperSpace(IN PMMPFN Pfn1
,
1186 IN PFN_NUMBER NumberOfPages
);
1190 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1191 IN PFN_NUMBER NumberOfPages
);
1194 // ReactOS Compatibility Layer
1198 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1200 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1201 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1204 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1206 /* i386/page.c *********************************************************/
1210 MmCreateVirtualMappingForKernel(
1219 MmCommitPagedPoolAddress(
1226 MmCreateVirtualMapping(
1227 struct _EPROCESS
* Process
,
1236 MmCreateVirtualMappingUnsafe(
1237 struct _EPROCESS
* Process
,
1247 struct _EPROCESS
* Process
,
1253 struct _EPROCESS
* Process
,
1261 struct _EPROCESS
* Process
,
1267 MmInitGlobalKernelPageDirectory(VOID
);
1271 MmDisableVirtualMapping(
1272 struct _EPROCESS
*Process
,
1280 MmEnableVirtualMapping(
1281 struct _EPROCESS
*Process
,
1287 MmRawDeleteVirtualMapping(PVOID Address
);
1291 MmDeletePageFileMapping(
1292 struct _EPROCESS
*Process
,
1294 SWAPENTRY
* SwapEntry
1299 MmCreatePageFileMapping(
1300 struct _EPROCESS
*Process
,
1308 struct _EPROCESS
*Process
,
1314 MmTransferOwnershipPage(
1322 struct _EPROCESS
*Process
,
1334 MmAllocPagesSpecifyRange(
1336 PHYSICAL_ADDRESS LowestAddress
,
1337 PHYSICAL_ADDRESS HighestAddress
,
1338 ULONG NumberOfPages
,
1344 MmDereferencePage(PFN_NUMBER Page
);
1348 MmReferencePage(PFN_NUMBER Page
);
1352 MmGetReferenceCountPage(PFN_NUMBER Page
);
1356 MmIsPageInUse(PFN_NUMBER Page
);
1360 MmSetSavedSwapEntryPage(
1362 SWAPENTRY SavedSwapEntry
);
1366 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1371 struct _EPROCESS
*Process
,
1377 MmCreatePageTable(PVOID PAddress
);
1382 struct _EPROCESS
*Process
,
1389 struct _EPROCESS
*Process
,
1395 MmCreateProcessAddressSpace(
1398 IN PULONG_PTR DirectoryTableBase
1403 MmInitializeHandBuiltProcess(
1404 IN PEPROCESS Process
,
1405 IN PULONG_PTR DirectoryTableBase
1411 MmInitializeHandBuiltProcess2(
1412 IN PEPROCESS Process
1417 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1421 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1425 MmDeleteVirtualMapping(
1426 struct _EPROCESS
*Process
,
1436 struct _EPROCESS
*Process
,
1442 MmMarkPageMapped(PFN_NUMBER Page
);
1446 MmMarkPageUnmapped(PFN_NUMBER Page
);
1451 struct _EPROCESS
*Process
,
1458 MiInitPageDirectoryMap(VOID
);
1462 MiGetUserPageDirectoryCount(VOID
);
1464 /* wset.c ********************************************************************/
1473 /* region.c ************************************************************/
1478 PMMSUPPORT AddressSpace
,
1480 PLIST_ENTRY RegionListHead
,
1485 PMM_ALTER_REGION_FUNC AlterFunc
1491 PLIST_ENTRY RegionListHead
,
1501 PLIST_ENTRY RegionListHead
,
1503 PVOID
* RegionBaseAddress
1506 /* section.c *****************************************************************/
1510 MmGetFileObjectForSection(
1515 MmGetFileNameForAddress(
1517 OUT PUNICODE_STRING ModuleName
1522 MmGetFileNameForSection(
1524 OUT POBJECT_NAME_INFORMATION
*ModuleName
1537 PMEMORY_AREA MemoryArea
,
1539 PMEMORY_BASIC_INFORMATION Info
,
1540 PSIZE_T ResultLength
1545 MmProtectSectionView(
1546 PMMSUPPORT AddressSpace
,
1547 PMEMORY_AREA MemoryArea
,
1556 MmWritePageSectionView(
1557 PMMSUPPORT AddressSpace
,
1565 MmInitSectionImplementation(VOID
);
1569 MmNotPresentFaultSectionView(
1570 PMMSUPPORT AddressSpace
,
1571 MEMORY_AREA
* MemoryArea
,
1578 MmPageOutSectionView(
1579 PMMSUPPORT AddressSpace
,
1580 PMEMORY_AREA MemoryArea
,
1582 struct _MM_PAGEOP
*PageOp
1587 MmCreatePhysicalMemorySection(VOID
);
1591 MmAccessFaultSectionView(
1592 PMMSUPPORT AddressSpace
,
1593 MEMORY_AREA
* MemoryArea
,
1600 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1602 /* mpw.c *********************************************************************/
1606 MmInitMpwThread(VOID
);
1610 MmInitBsmThread(VOID
);
1612 /* pager.c *******************************************************************/
1616 MiIsPagerThread(VOID
);
1620 MiStartPagerThread(VOID
);
1624 MiStopPagerThread(VOID
);
1628 MiQueryVirtualMemory(
1629 IN HANDLE ProcessHandle
,
1631 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1632 OUT PVOID VirtualMemoryInformation
,
1634 OUT PSIZE_T ResultLength
1637 /* sysldr.c ******************************************************************/
1641 MiReloadBootLoadedDrivers(
1642 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1647 MiInitializeLoadedModuleList(
1648 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1654 IN PUNICODE_STRING FileName
,
1655 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1656 IN PUNICODE_STRING LoadedName OPTIONAL
,
1658 OUT PVOID
*ModuleObject
,
1659 OUT PVOID
*ImageBaseAddress
1664 MmUnloadSystemImage(
1665 IN PVOID ImageHandle
1671 IN HANDLE ImageHandle
,
1672 IN BOOLEAN PurgeSection
1677 MmCallDllInitialize(
1678 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1679 IN PLIST_ENTRY ListHead
1682 extern PMMSUPPORT MmKernelAddressSpace
;
1686 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1688 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1693 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1695 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1700 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1702 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1703 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1708 MmGetCurrentAddressSpace(VOID
)
1710 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1715 MmGetKernelAddressSpace(VOID
)
1717 return MmKernelAddressSpace
;