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
;
52 typedef ULONG_PTR 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_CACHE (2)
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 /* Number of list heads to use */
87 #define MI_FREE_POOL_LISTS 4
90 /* Signature of free pool blocks */
91 #define MM_FREE_POOL_TAG 'lprF'
93 /* Although Microsoft says this isn't hardcoded anymore,
94 they won't be able to change it. Stuff depends on it */
95 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
97 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
100 * Additional flags for protection attributes
102 #define PAGE_WRITETHROUGH (1024)
103 #define PAGE_SYSTEM (2048)
105 #define SEC_PHYSICALMEMORY (0x80000000)
107 #define MM_PAGEFILE_SEGMENT (0x1)
108 #define MM_DATAFILE_SEGMENT (0x2)
112 #define MC_SYSTEM (2)
113 #define MC_MAXIMUM (3)
115 #define PAGED_POOL_MASK 1
116 #define MUST_SUCCEED_POOL_MASK 2
117 #define CACHE_ALIGNED_POOL_MASK 4
118 #define QUOTA_POOL_MASK 8
119 #define SESSION_POOL_MASK 32
120 #define VERIFIER_POOL_MASK 64
122 #define MM_PAGED_POOL_SIZE (100*1024*1024)
123 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
126 * Paged and non-paged pools are 8-byte aligned
128 #define MM_POOL_ALIGNMENT 8
130 #define MM_ROUND_UP(x,s) \
131 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
133 #define MM_ROUND_DOWN(x,s) \
134 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
136 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
141 PAGE_EXECUTE_READ | \
142 PAGE_EXECUTE_READWRITE | \
143 PAGE_EXECUTE_WRITECOPY | \
148 #define PAGE_FLAGS_VALID_FOR_SECTION \
153 PAGE_EXECUTE_READ | \
154 PAGE_EXECUTE_READWRITE | \
155 PAGE_EXECUTE_WRITECOPY | \
158 #define PAGE_IS_READABLE \
162 PAGE_EXECUTE_READ | \
163 PAGE_EXECUTE_READWRITE | \
164 PAGE_EXECUTE_WRITECOPY)
166 #define PAGE_IS_WRITABLE \
169 PAGE_EXECUTE_READWRITE | \
170 PAGE_EXECUTE_WRITECOPY)
172 #define PAGE_IS_EXECUTABLE \
174 PAGE_EXECUTE_READ | \
175 PAGE_EXECUTE_READWRITE | \
176 PAGE_EXECUTE_WRITECOPY)
178 #define PAGE_IS_WRITECOPY \
180 PAGE_EXECUTE_WRITECOPY)
183 // Wait entry for marking pages that are being serviced
185 #define MM_WAIT_ENTRY 0x7ffffc00
187 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
188 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
190 #define InterlockedExchangePte(PointerPte, Value) \
191 InterlockedExchange((PLONG)(PointerPte), Value)
193 typedef struct _MM_SECTION_SEGMENT
195 FAST_MUTEX Lock
; /* lock which protects the page directory */
196 PFILE_OBJECT FileObject
;
197 LARGE_INTEGER RawLength
; /* length of the segment which is part of the mapped file */
198 LARGE_INTEGER Length
; /* absolute length of the segment */
199 ULONG ReferenceCount
;
208 ULONGLONG FileOffset
; /* start offset into the file for image sections */
209 ULONG_PTR VirtualAddress
; /* start offset into the address range for image sections */
210 ULONG Characteristics
;
213 LIST_ENTRY ListOfSegments
;
214 RTL_GENERIC_TABLE PageTable
;
215 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
217 typedef struct _MM_IMAGE_SECTION_OBJECT
220 ULONG_PTR StackReserve
;
221 ULONG_PTR StackCommit
;
222 ULONG_PTR EntryPoint
;
224 USHORT ImageCharacteristics
;
225 USHORT MinorSubsystemVersion
;
226 USHORT MajorSubsystemVersion
;
231 PMM_SECTION_SEGMENT Segments
;
232 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
234 typedef struct _ROS_SECTION_OBJECT
238 LARGE_INTEGER MaximumSize
;
239 ULONG SectionPageProtection
;
240 ULONG AllocationAttributes
;
241 PFILE_OBJECT FileObject
;
244 PMM_IMAGE_SECTION_OBJECT ImageSection
;
245 PMM_SECTION_SEGMENT Segment
;
247 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
249 typedef struct _MEMORY_AREA
251 PVOID StartingAddress
;
253 struct _MEMORY_AREA
*Parent
;
254 struct _MEMORY_AREA
*LeftChild
;
255 struct _MEMORY_AREA
*RightChild
;
259 BOOLEAN DeleteInProgress
;
266 ROS_SECTION_OBJECT
* Section
;
267 LARGE_INTEGER ViewOffset
;
268 PMM_SECTION_SEGMENT Segment
;
269 LIST_ENTRY RegionListHead
;
273 LIST_ENTRY RegionListHead
;
276 } MEMORY_AREA
, *PMEMORY_AREA
;
278 typedef struct _MM_RMAP_ENTRY
280 struct _MM_RMAP_ENTRY
* Next
;
287 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
290 extern ULONG MI_PFN_CURRENT_USAGE
;
291 extern CHAR MI_PFN_CURRENT_PROCESS_NAME
[16];
292 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
293 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
295 #define MI_SET_USAGE(x)
296 #define MI_SET_PROCESS2(x)
299 typedef enum _MI_PFN_USAGES
301 MI_USAGE_NOT_SET
= 0,
303 MI_USAGE_NONPAGED_POOL
,
304 MI_USAGE_NONPAGED_POOL_EXPANSION
,
305 MI_USAGE_KERNEL_STACK
,
306 MI_USAGE_KERNEL_STACK_EXPANSION
,
312 MI_USAGE_PAGE_DIRECTORY
,
313 MI_USAGE_LEGACY_PAGE_DIRECTORY
,
314 MI_USAGE_DRIVER_PAGE
,
315 MI_USAGE_CONTINOUS_ALLOCATION
,
317 MI_USAGE_DEMAND_ZERO
,
320 MI_USAGE_PFN_DATABASE
,
321 MI_USAGE_BOOT_DRIVER
,
322 MI_USAGE_INIT_MEMORY
,
327 // These two mappings are actually used by Windows itself, based on the ASSERTS
329 #define StartOfAllocation ReadInProgress
330 #define EndOfAllocation WriteInProgress
332 typedef struct _MMPFNENTRY
335 USHORT ReadInProgress
:1; // StartOfAllocation
336 USHORT WriteInProgress
:1; // EndOfAllocation
337 USHORT PrototypePte
:1;
339 USHORT PageLocation
:3;
340 USHORT RemovalRequested
:1;
341 USHORT CacheAttribute
:2;
343 USHORT ParityError
:1; // HasRmap
346 typedef struct _MMPFN
351 ULONG WsIndex
; // SavedSwapEntry
354 SINGLE_LIST_ENTRY NextStackPfn
;
360 ULONG_PTR ShareCount
;
366 USHORT ReferenceCount
; // ReferenceCount
371 USHORT ReferenceCount
;
378 LONG AweReferenceCount
; // RmapListHead
382 ULONG_PTR EntireFrame
;
385 ULONG_PTR PteFrame
:25;
386 ULONG_PTR InPageError
:1;
387 ULONG_PTR VerifierAllocation
:1;
388 ULONG_PTR AweAllocation
:1;
389 ULONG_PTR Priority
:3;
390 ULONG_PTR MustBeCached
:1;
394 MI_PFN_USAGES PfnUsage
;
395 CHAR ProcessName
[16];
399 extern PMMPFN MmPfnDatabase
;
401 typedef struct _MMPFNLIST
407 } MMPFNLIST
, *PMMPFNLIST
;
409 extern MMPFNLIST MmZeroedPageListHead
;
410 extern MMPFNLIST MmFreePageListHead
;
411 extern MMPFNLIST MmStandbyPageListHead
;
412 extern MMPFNLIST MmModifiedPageListHead
;
413 extern MMPFNLIST MmModifiedNoWritePageListHead
;
415 typedef struct _MM_MEMORY_CONSUMER
419 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
420 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
422 typedef struct _MM_REGION
427 LIST_ENTRY RegionListEntry
;
428 } MM_REGION
, *PMM_REGION
;
430 /* Entry describing free pool memory */
431 typedef struct _MMFREE_POOL_ENTRY
436 struct _MMFREE_POOL_ENTRY
*Owner
;
437 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
439 /* Signature of a freed block */
440 #define MM_FREE_POOL_SIGNATURE 'ARM3'
442 /* Paged pool information */
443 typedef struct _MM_PAGED_POOL_INFO
445 PRTL_BITMAP PagedPoolAllocationMap
;
446 PRTL_BITMAP EndOfPagedPoolBitmap
;
447 PMMPTE FirstPteForPagedPool
;
448 PMMPTE LastPteForPagedPool
;
449 PMMPDE NextPdeForPagedPoolExpansion
;
451 SIZE_T PagedPoolCommit
;
452 SIZE_T AllocatedPagedPool
;
453 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
455 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
458 (*PMM_ALTER_REGION_FUNC
)(
459 PMMSUPPORT AddressSpace
,
469 (*PMM_FREE_PAGE_FUNC
)(
471 PMEMORY_AREA MemoryArea
,
479 // Mm copy support for Kd
491 // Determines if a given address is a session address
505 /* marea.c *******************************************************************/
510 PMMSUPPORT AddressSpace
,
515 PMEMORY_AREA
*Result
,
516 BOOLEAN FixedAddress
,
517 ULONG AllocationFlags
,
518 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
523 MmLocateMemoryAreaByAddress(
524 PMMSUPPORT AddressSpace
,
531 PMMSUPPORT AddressSpace
,
538 PMMSUPPORT AddressSpace
,
539 PMEMORY_AREA MemoryArea
,
540 PMM_FREE_PAGE_FUNC FreePage
,
541 PVOID FreePageContext
546 MmFreeMemoryAreaByPtr(
547 PMMSUPPORT AddressSpace
,
549 PMM_FREE_PAGE_FUNC FreePage
,
550 PVOID FreePageContext
555 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
559 MmLocateMemoryAreaByRegion(
560 PMMSUPPORT AddressSpace
,
568 PMMSUPPORT AddressSpace
,
570 ULONG_PTR Granularity
,
576 MmReleaseMemoryAreaIfDecommitted(
577 struct _EPROCESS
*Process
,
578 PMMSUPPORT AddressSpace
,
584 MmMapMemoryArea(PVOID BaseAddress
,
591 MiRosCheckMemoryAreas(
592 PMMSUPPORT AddressSpace
);
596 MiCheckAllProcessMemoryAreas(VOID
);
598 /* npool.c *******************************************************************/
602 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
606 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
610 MiInitializeNonPagedPool(VOID
);
615 IN POOL_TYPE PoolType
,
616 IN SIZE_T SizeInBytes
622 IN PVOID VirtualAddress
628 IN PVOID StartingAddress
638 /* pool.c *******************************************************************/
642 ExAllocateNonPagedPoolWithTag(
651 ExAllocatePagedPoolWithTag(
659 ExFreeNonPagedPool(PVOID block
);
663 ExFreePagedPool(IN PVOID Block
);
667 ExpIsPoolTagDebuggable(ULONG Tag
);
671 ExpAllocateDebugPool(
681 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
685 MmInitializePagedPool(VOID
);
689 MiAllocateSpecialPool(
690 IN POOL_TYPE PoolType
,
691 IN SIZE_T NumberOfBytes
,
699 IN POOL_TYPE PoolType
,
700 IN ULONG CurrentMaxQuota
,
701 OUT PULONG NewMaxQuota
704 /* mdl.c *********************************************************************/
713 /* mminit.c ******************************************************************/
717 MiShutdownMemoryManager(VOID
);
727 MmInitSystem(IN ULONG Phase
,
728 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
732 MiFreeInitMemory(VOID
);
736 MmInitializeMdlImplementation(VOID
);
738 /* pagefile.c ****************************************************************/
742 MmAllocSwapPage(VOID
);
746 MmDereserveSwapPages(ULONG Nr
);
750 MmFreeSwapPage(SWAPENTRY Entry
);
754 MmInitPagingFile(VOID
);
758 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject
);
769 MmReserveSwapPages(ULONG Nr
);
782 ULONG BugCodeParameter1
,
783 ULONG BugCodeParameter2
,
784 ULONG BugCodeParameter3
,
785 ULONG BugCodeParameter4
,
786 struct _KTRAP_FRAME
* TrapFrame
791 MmIsAvailableSwapPage(VOID
);
795 MmShowOutOfSpaceMessagePagingFile(VOID
);
797 /* process.c ****************************************************************/
801 MmInitializeProcessAddressSpace(
802 IN PEPROCESS Process
,
803 IN PEPROCESS Clone OPTIONAL
,
804 IN PVOID Section OPTIONAL
,
806 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
812 IN PEPROCESS Process
,
813 IN PINITIAL_PEB InitialPeb
,
820 IN PEPROCESS Process
,
821 IN PCLIENT_ID ClientId
,
822 IN PINITIAL_TEB InitialTeb
,
829 struct _EPROCESS
*Process
,
835 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
839 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
843 MmGetSessionLocaleId(VOID
);
847 MmSetMemoryPriorityProcess(
848 IN PEPROCESS Process
,
849 IN UCHAR MemoryPriority
852 /* i386/pfault.c *************************************************************/
864 /* special.c *****************************************************************/
868 MiInitializeSpecialPool();
873 IN SIZE_T NumberOfBytes
,
878 MmIsSpecialPoolAddress(
883 MmAllocateSpecialPool(
884 IN SIZE_T NumberOfBytes
,
886 IN POOL_TYPE PoolType
,
887 IN ULONG SpecialType
);
894 /* mm.c **********************************************************************/
899 IN BOOLEAN StoreInstruction
,
901 IN KPROCESSOR_MODE Mode
,
902 IN PVOID TrapInformation
905 /* anonmem.c *****************************************************************/
909 MmNotPresentFaultVirtualMemory(
910 PMMSUPPORT AddressSpace
,
911 MEMORY_AREA
* MemoryArea
,
917 MmPageOutVirtualMemory(
918 PMMSUPPORT AddressSpace
,
919 PMEMORY_AREA MemoryArea
,
927 PMEMORY_AREA MemoryArea
,
929 PMEMORY_BASIC_INFORMATION Info
,
936 struct _EPROCESS
* Process
,
937 PMEMORY_AREA MemoryArea
943 PMMSUPPORT AddressSpace
,
944 PMEMORY_AREA MemoryArea
,
953 MmWritePageVirtualMemory(
954 PMMSUPPORT AddressSpace
,
960 /* kmap.c ********************************************************************/
964 ExAllocatePage(VOID
);
968 ExUnmapPage(PVOID Addr
);
972 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
983 MiZeroPage(PFN_NUMBER Page
);
985 /* memsafe.s *****************************************************************/
989 MmSafeReadPtr(PVOID Source
);
991 /* process.c *****************************************************************/
995 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
999 MmDeleteKernelStack(PVOID Stack
,
1002 /* balace.c ******************************************************************/
1006 MmInitializeMemoryConsumer(
1008 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
1013 MmInitializeBalancer(
1014 ULONG NrAvailablePages
,
1020 MmReleasePageMemoryConsumer(
1027 MmRequestPageMemoryConsumer(
1030 PPFN_NUMBER AllocatedPage
1035 MiInitBalancerThread(VOID
);
1039 MmRebalanceMemoryConsumers(VOID
);
1041 /* rmap.c **************************************************************/
1045 MmSetRmapListHeadPage(
1047 struct _MM_RMAP_ENTRY
* ListHead
1050 struct _MM_RMAP_ENTRY
*
1052 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1058 struct _EPROCESS
*Process
,
1067 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1074 struct _EPROCESS
*Process
,
1080 MmInitializeRmapList(VOID
);
1084 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1088 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1092 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1096 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1098 /* freelist.c **********************************************************/
1102 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1105 extern RTL_BITMAP MiPfnBitMap
;
1107 /* Make sure the PFN number is valid */
1108 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1110 /* Make sure this page actually has a PFN entry */
1111 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, (ULONG
)Pfn
))) return NULL
;
1114 Page
= &MmPfnDatabase
[Pfn
];
1122 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1125 // This will return the Page Frame Number (PFN) from the MMPFN
1127 return Pfn1
- MmPfnDatabase
;
1132 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1136 MmGetLRUFirstUserPage(VOID
);
1140 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1144 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1148 MmLockPage(PFN_NUMBER Page
);
1152 MmUnlockPage(PFN_NUMBER Page
);
1156 MmGetLockCountPage(PFN_NUMBER Page
);
1160 MmInitializePageList(
1166 MmDumpArmPfnDatabase(
1167 IN BOOLEAN StatusOnly
1172 MmGetContinuousPages(
1173 ULONG NumberOfBytes
,
1174 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1175 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1176 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1186 /* hypermap.c *****************************************************************/
1188 extern PEPROCESS HyperProcess
;
1189 extern KIRQL HyperIrql
;
1193 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1199 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1205 MiMapPagesInZeroSpace(IN PMMPFN Pfn1
,
1206 IN PFN_NUMBER NumberOfPages
);
1210 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1211 IN PFN_NUMBER NumberOfPages
);
1214 // ReactOS Compatibility Layer
1218 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1220 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1221 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1224 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1226 /* i386/page.c *********************************************************/
1230 MmCreateVirtualMappingForKernel(
1239 MmCommitPagedPoolAddress(
1246 MmCreateVirtualMapping(
1247 struct _EPROCESS
* Process
,
1256 MmCreateVirtualMappingUnsafe(
1257 struct _EPROCESS
* Process
,
1267 struct _EPROCESS
* Process
,
1273 struct _EPROCESS
* Process
,
1281 struct _EPROCESS
* Process
,
1288 struct _EPROCESS
* Process
,
1294 MmInitGlobalKernelPageDirectory(VOID
);
1298 MmDisableVirtualMapping(
1299 struct _EPROCESS
*Process
,
1307 MmEnableVirtualMapping(
1308 struct _EPROCESS
*Process
,
1314 MmRawDeleteVirtualMapping(PVOID Address
);
1319 MmGetPageFileMapping(
1320 struct _EPROCESS
*Process
,
1322 SWAPENTRY
* SwapEntry
);
1326 MmDeletePageFileMapping(
1327 struct _EPROCESS
*Process
,
1329 SWAPENTRY
* SwapEntry
1334 MmCreatePageFileMapping(
1335 struct _EPROCESS
*Process
,
1343 struct _EPROCESS
*Process
,
1349 MmTransferOwnershipPage(
1357 struct _EPROCESS
*Process
,
1369 MmAllocPagesSpecifyRange(
1371 PHYSICAL_ADDRESS LowestAddress
,
1372 PHYSICAL_ADDRESS HighestAddress
,
1373 ULONG NumberOfPages
,
1379 MmDereferencePage(PFN_NUMBER Page
);
1383 MmReferencePage(PFN_NUMBER Page
);
1387 MmGetReferenceCountPage(PFN_NUMBER Page
);
1391 MmIsPageInUse(PFN_NUMBER Page
);
1395 MmSetSavedSwapEntryPage(
1397 SWAPENTRY SavedSwapEntry
);
1401 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1406 struct _EPROCESS
*Process
,
1412 MmCreatePageTable(PVOID PAddress
);
1417 struct _EPROCESS
*Process
,
1424 struct _EPROCESS
*Process
,
1430 MmCreateProcessAddressSpace(
1433 IN PULONG_PTR DirectoryTableBase
1438 MmInitializeHandBuiltProcess(
1439 IN PEPROCESS Process
,
1440 IN PULONG_PTR DirectoryTableBase
1446 MmInitializeHandBuiltProcess2(
1447 IN PEPROCESS Process
1452 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1456 MmSetExecuteOptions(IN ULONG ExecuteOptions
);
1460 MmGetExecuteOptions(IN PULONG ExecuteOptions
);
1464 MmDeleteProcessPageDirectory(struct _EPROCESS
*Process
);
1468 MmDeleteVirtualMapping(
1469 struct _EPROCESS
*Process
,
1479 struct _EPROCESS
*Process
,
1485 MmMarkPageMapped(PFN_NUMBER Page
);
1489 MmMarkPageUnmapped(PFN_NUMBER Page
);
1494 struct _EPROCESS
*Process
,
1501 MiInitPageDirectoryMap(VOID
);
1505 MiGetUserPageDirectoryCount(VOID
);
1507 /* wset.c ********************************************************************/
1516 /* region.c ************************************************************/
1521 PMMSUPPORT AddressSpace
,
1523 PLIST_ENTRY RegionListHead
,
1528 PMM_ALTER_REGION_FUNC AlterFunc
1534 PLIST_ENTRY RegionListHead
,
1544 PLIST_ENTRY RegionListHead
,
1546 PVOID
* RegionBaseAddress
1549 /* section.c *****************************************************************/
1553 MmGetFileObjectForSection(
1558 MmGetFileNameForAddress(
1560 OUT PUNICODE_STRING ModuleName
1565 MmGetFileNameForSection(
1567 OUT POBJECT_NAME_INFORMATION
*ModuleName
1580 PMEMORY_AREA MemoryArea
,
1582 PMEMORY_BASIC_INFORMATION Info
,
1583 PSIZE_T ResultLength
1588 MmProtectSectionView(
1589 PMMSUPPORT AddressSpace
,
1590 PMEMORY_AREA MemoryArea
,
1599 MmInitSectionImplementation(VOID
);
1603 MmNotPresentFaultSectionView(
1604 PMMSUPPORT AddressSpace
,
1605 MEMORY_AREA
* MemoryArea
,
1612 MmPageOutSectionView(
1613 PMMSUPPORT AddressSpace
,
1614 PMEMORY_AREA MemoryArea
,
1621 MmCreatePhysicalMemorySection(VOID
);
1625 MmAccessFaultSectionView(
1626 PMMSUPPORT AddressSpace
,
1627 MEMORY_AREA
* MemoryArea
,
1633 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1635 /* mpw.c *********************************************************************/
1639 MmInitMpwThread(VOID
);
1643 MmInitBsmThread(VOID
);
1645 /* pager.c *******************************************************************/
1649 MiIsPagerThread(VOID
);
1653 MiStartPagerThread(VOID
);
1657 MiStopPagerThread(VOID
);
1661 MiQueryVirtualMemory(
1662 IN HANDLE ProcessHandle
,
1664 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1665 OUT PVOID VirtualMemoryInformation
,
1667 OUT PSIZE_T ResultLength
1670 /* sysldr.c ******************************************************************/
1674 MiReloadBootLoadedDrivers(
1675 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1680 MiInitializeLoadedModuleList(
1681 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1687 IN PUNICODE_STRING FileName
,
1688 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1689 IN PUNICODE_STRING LoadedName OPTIONAL
,
1691 OUT PVOID
*ModuleObject
,
1692 OUT PVOID
*ImageBaseAddress
1697 MmUnloadSystemImage(
1698 IN PVOID ImageHandle
1704 IN HANDLE ImageHandle
,
1705 IN BOOLEAN PurgeSection
1710 MmCallDllInitialize(
1711 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1712 IN PLIST_ENTRY ListHead
1716 /* procsup.c *****************************************************************/
1721 IN PVOID StackPointer
1727 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1729 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1734 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1736 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1741 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1743 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1744 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1749 MmGetCurrentAddressSpace(VOID
)
1751 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1756 MmGetKernelAddressSpace(VOID
)
1758 return MmKernelAddressSpace
;
1762 /* expool.c ******************************************************************/
1766 ExpCheckPoolAllocation(