1 #ifndef __INCLUDE_INTERNAL_MM_H
2 #define __INCLUDE_INTERNAL_MM_H
4 #include <internal/arch/mm.h>
6 /* TYPES *********************************************************************/
10 extern ULONG MiFreeSwapPages
;
11 extern ULONG MiUsedSwapPages
;
12 extern ULONG MmPagedPoolSize
;
13 extern ULONG MmTotalPagedPoolQuota
;
14 extern ULONG MmTotalNonPagedPoolQuota
;
15 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
16 extern ULONG MmNumberOfPhysicalPages
;
17 extern UCHAR MmDisablePagingExecutive
;
18 extern ULONG MmLowestPhysicalPage
;
19 extern ULONG MmHighestPhysicalPage
;
20 extern ULONG MmAvailablePages
;
21 extern ULONG MmResidentAvailablePages
;
22 extern ULONG MmNumberOfSystemPtes
;
24 extern PVOID MmPagedPoolBase
;
25 extern ULONG MmPagedPoolSize
;
27 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
28 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
30 extern LIST_ENTRY MmLoadedUserImageList
;
32 extern ULONG MmNumberOfPagingFiles
;
34 extern PVOID MmUnloadedDrivers
;
35 extern PVOID MmLastUnloadedDrivers
;
36 extern PVOID MmTriageActionTaken
;
37 extern PVOID KernelVerifier
;
38 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
40 extern SIZE_T MmTotalCommitLimit
;
41 extern SIZE_T MmTotalCommittedPages
;
42 extern SIZE_T MmSharedCommit
;
43 extern SIZE_T MmDriverCommit
;
44 extern SIZE_T MmProcessCommit
;
45 extern SIZE_T MmPagedPoolCommit
;
46 extern SIZE_T MmPeakCommitment
;
47 extern SIZE_T MmtotalCommitLimitMaximum
;
49 extern PVOID MiDebugMapping
;
50 extern PMMPTE MmDebugPte
;
54 struct _MM_RMAP_ENTRY
;
56 typedef ULONG SWAPENTRY
;
59 // MmDbgCopyMemory Flags
61 #define MMDBG_COPY_WRITE 0x00000001
62 #define MMDBG_COPY_PHYSICAL 0x00000002
63 #define MMDBG_COPY_UNSAFE 0x00000004
64 #define MMDBG_COPY_CACHED 0x00000008
65 #define MMDBG_COPY_UNCACHED 0x00000010
66 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
69 // Maximum chunk size per copy
71 #define MMDBG_COPY_MAX_SIZE 0x8
74 #define MI_STATIC_MEMORY_AREAS (14)
76 #define MI_STATIC_MEMORY_AREAS (13)
79 #define MEMORY_AREA_INVALID (0)
80 #define MEMORY_AREA_SECTION_VIEW (1)
81 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
82 #define MEMORY_AREA_NO_CACHE (3)
83 #define MEMORY_AREA_IO_MAPPING (4)
84 #define MEMORY_AREA_SYSTEM (5)
85 #define MEMORY_AREA_MDL_MAPPING (7)
86 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
87 #define MEMORY_AREA_CACHE_SEGMENT (9)
88 #define MEMORY_AREA_SHARED_DATA (10)
89 #define MEMORY_AREA_KERNEL_STACK (11)
90 #define MEMORY_AREA_PAGED_POOL (12)
91 #define MEMORY_AREA_NO_ACCESS (13)
92 #define MEMORY_AREA_PEB_OR_TEB (14)
93 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
94 #define MEMORY_AREA_STATIC (0x80000000)
96 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
98 #define MM_CORE_DUMP_TYPE_NONE (0x0)
99 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
100 #define MM_CORE_DUMP_TYPE_FULL (0x2)
102 #define MM_PAGEOP_PAGEIN (1)
103 #define MM_PAGEOP_PAGEOUT (2)
104 #define MM_PAGEOP_PAGESYNCH (3)
105 #define MM_PAGEOP_ACCESSFAULT (4)
107 /* Number of list heads to use */
108 #define MI_FREE_POOL_LISTS 4
110 #define MI_HYPERSPACE_PTES (256 - 1)
111 #define MI_ZERO_PTES (32)
112 #define MI_MAPPING_RANGE_START (ULONG_PTR)HYPER_SPACE
113 #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
114 MI_HYPERSPACE_PTES * PAGE_SIZE)
115 #define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \
118 /* Signature of free pool blocks */
119 #define MM_FREE_POOL_TAG 'lprF'
121 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
122 ((x) / (4*1024*1024))
124 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
125 ((((x)) % (4*1024*1024)) / (4*1024))
127 #define NR_SECTION_PAGE_TABLES 1024
128 #define NR_SECTION_PAGE_ENTRIES 1024
130 #define TEB_BASE 0x7FFDE000
132 /* Although Microsoft says this isn't hardcoded anymore,
133 they won't be able to change it. Stuff depends on it */
134 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
136 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
139 * Additional flags for protection attributes
141 #define PAGE_WRITETHROUGH (1024)
142 #define PAGE_SYSTEM (2048)
144 #define SEC_PHYSICALMEMORY (0x80000000)
146 #define MM_PAGEFILE_SEGMENT (0x1)
147 #define MM_DATAFILE_SEGMENT (0x2)
152 #define MC_NPPOOL (3)
153 #define MC_SYSTEM (4)
154 #define MC_MAXIMUM (5)
156 #define PAGED_POOL_MASK 1
157 #define MUST_SUCCEED_POOL_MASK 2
158 #define CACHE_ALIGNED_POOL_MASK 4
159 #define QUOTA_POOL_MASK 8
160 #define SESSION_POOL_MASK 32
161 #define VERIFIER_POOL_MASK 64
163 #define MM_PAGED_POOL_SIZE (100*1024*1024)
164 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
167 * Paged and non-paged pools are 8-byte aligned
169 #define MM_POOL_ALIGNMENT 8
172 * Maximum size of the kmalloc area (this is totally arbitary)
174 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
175 #define MM_KERNEL_MAP_BASE (0xf0c00000)
178 * FIXME - different architectures have different cache line sizes...
180 #define MM_CACHE_LINE_SIZE 32
182 #define MM_ROUND_UP(x,s) \
183 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
185 #define MM_ROUND_DOWN(x,s) \
186 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
188 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
193 PAGE_EXECUTE_READ | \
194 PAGE_EXECUTE_READWRITE | \
195 PAGE_EXECUTE_WRITECOPY | \
200 #define PAGE_FLAGS_VALID_FOR_SECTION \
205 PAGE_EXECUTE_READ | \
206 PAGE_EXECUTE_READWRITE | \
207 PAGE_EXECUTE_WRITECOPY | \
210 #define PAGE_IS_READABLE \
214 PAGE_EXECUTE_READ | \
215 PAGE_EXECUTE_READWRITE | \
216 PAGE_EXECUTE_WRITECOPY)
218 #define PAGE_IS_WRITABLE \
221 PAGE_EXECUTE_READWRITE | \
222 PAGE_EXECUTE_WRITECOPY)
224 #define PAGE_IS_EXECUTABLE \
226 PAGE_EXECUTE_READ | \
227 PAGE_EXECUTE_READWRITE | \
228 PAGE_EXECUTE_WRITECOPY)
230 #define PAGE_IS_WRITECOPY \
232 PAGE_EXECUTE_WRITECOPY)
235 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
236 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
238 #define InterlockedExchangePte(PointerPte, Value) \
239 InterlockedExchange((PLONG)(PointerPte), Value)
243 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
244 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
248 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
249 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
251 typedef struct _MM_SECTION_SEGMENT
253 LONG FileOffset
; /* start offset into the file for image sections */
254 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
255 ULONG RawLength
; /* length of the segment which is part of the mapped file */
256 ULONG Length
; /* absolute length of the segment */
258 FAST_MUTEX Lock
; /* lock which protects the page directory */
259 ULONG ReferenceCount
;
260 SECTION_PAGE_DIRECTORY PageDirectory
;
262 ULONG Characteristics
;
264 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
266 typedef struct _MM_IMAGE_SECTION_OBJECT
269 ULONG_PTR StackReserve
;
270 ULONG_PTR StackCommit
;
271 ULONG_PTR EntryPoint
;
273 USHORT ImageCharacteristics
;
274 USHORT MinorSubsystemVersion
;
275 USHORT MajorSubsystemVersion
;
280 PMM_SECTION_SEGMENT Segments
;
281 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
283 typedef struct _ROS_SECTION_OBJECT
287 LARGE_INTEGER MaximumSize
;
288 ULONG SectionPageProtection
;
289 ULONG AllocationAttributes
;
290 PFILE_OBJECT FileObject
;
293 PMM_IMAGE_SECTION_OBJECT ImageSection
;
294 PMM_SECTION_SEGMENT Segment
;
296 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
298 typedef struct _MEMORY_AREA
300 PVOID StartingAddress
;
302 struct _MEMORY_AREA
*Parent
;
303 struct _MEMORY_AREA
*LeftChild
;
304 struct _MEMORY_AREA
*RightChild
;
308 BOOLEAN DeleteInProgress
;
314 ROS_SECTION_OBJECT
* Section
;
316 PMM_SECTION_SEGMENT Segment
;
317 BOOLEAN WriteCopyView
;
318 LIST_ENTRY RegionListHead
;
322 LIST_ENTRY RegionListHead
;
325 } MEMORY_AREA
, *PMEMORY_AREA
;
328 // These two mappings are actually used by Windows itself, based on the ASSERTS
330 #define StartOfAllocation ReadInProgress
331 #define EndOfAllocation WriteInProgress
333 typedef struct _MMPFNENTRY
336 USHORT ReadInProgress
:1; // StartOfAllocation
337 USHORT WriteInProgress
:1; // EndOfAllocation
338 USHORT PrototypePte
:1; // Zero
339 USHORT PageColor
:4; // LockCount
340 USHORT PageLocation
:3; // Consumer
341 USHORT RemovalRequested
:1;
342 USHORT CacheAttribute
:2; // Type
344 USHORT ParityError
:1;
347 typedef struct _MMPFN
351 PFN_NUMBER Flink
; // ListEntry.Flink
355 SINGLE_LIST_ENTRY NextStackPfn
;
357 PMMPTE PteAddress
; // ListEntry.Blink
361 ULONG_PTR ShareCount
; // MapCount
367 USHORT ReferenceCount
; // ReferenceCount
372 USHORT ReferenceCount
;
377 ULONG UsedPageTableEntries
;
382 LONG AweReferenceCount
; // RmapListHead
386 ULONG_PTR EntireFrame
; // SavedSwapEntry
389 ULONG_PTR PteFrame
: 8*sizeof(PVOID
)-7;
390 ULONG_PTR InPageError
:1;
391 ULONG_PTR VerifierAllocation
:1;
392 ULONG_PTR AweAllocation
:1;
393 ULONG_PTR Priority
:3;
394 ULONG_PTR MustBeCached
:1;
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_PAGEOP
417 /* Type of operation. */
419 /* Number of threads interested in this operation. */
420 ULONG ReferenceCount
;
421 /* Event that will be set when the operation is completed. */
422 KEVENT CompletionEvent
;
423 /* Status of the operation once it is completed. */
425 /* TRUE if the operation was abandoned. */
427 /* The memory area to be affected by the operation. */
430 struct _MM_PAGEOP
* Next
;
431 struct _ETHREAD
* Thread
;
433 * These fields are used to identify the operation if it is against a
434 * virtual memory area.
439 * These fields are used to identify the operation if it is against a
442 PMM_SECTION_SEGMENT Segment
;
444 } MM_PAGEOP
, *PMM_PAGEOP
;
446 typedef struct _MM_MEMORY_CONSUMER
450 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
451 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
453 typedef struct _MM_REGION
458 LIST_ENTRY RegionListEntry
;
459 } MM_REGION
, *PMM_REGION
;
461 /* Entry describing free pool memory */
462 typedef struct _MMFREE_POOL_ENTRY
467 struct _MMFREE_POOL_ENTRY
*Owner
;
468 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
470 /* Paged pool information */
471 typedef struct _MM_PAGED_POOL_INFO
473 PRTL_BITMAP PagedPoolAllocationMap
;
474 PRTL_BITMAP EndOfPagedPoolBitmap
;
475 PMMPTE FirstPteForPagedPool
;
476 PMMPTE LastPteForPagedPool
;
477 PMMPTE NextPdeForPagedPoolExpansion
;
479 SIZE_T PagedPoolCommit
;
480 SIZE_T AllocatedPagedPool
;
481 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
483 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
486 (*PMM_ALTER_REGION_FUNC
)(
487 PMMSUPPORT AddressSpace
,
497 (*PMM_FREE_PAGE_FUNC
)(
499 PMEMORY_AREA MemoryArea
,
507 // Mm copy support for Kd
519 // Determines if a given address is a session address
527 /* marea.c *******************************************************************/
532 PMMSUPPORT AddressSpace
,
537 PMEMORY_AREA
*Result
,
538 BOOLEAN FixedAddress
,
539 ULONG AllocationFlags
,
540 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
545 MmLocateMemoryAreaByAddress(
546 PMMSUPPORT AddressSpace
,
553 PMMSUPPORT AddressSpace
,
560 PMMSUPPORT AddressSpace
,
561 PMEMORY_AREA MemoryArea
,
562 PMM_FREE_PAGE_FUNC FreePage
,
563 PVOID FreePageContext
568 MmFreeMemoryAreaByPtr(
569 PMMSUPPORT AddressSpace
,
571 PMM_FREE_PAGE_FUNC FreePage
,
572 PVOID FreePageContext
577 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
581 MmLocateMemoryAreaByRegion(
582 PMMSUPPORT AddressSpace
,
590 PMMSUPPORT AddressSpace
,
592 ULONG_PTR Granularity
,
598 MmReleaseMemoryAreaIfDecommitted(
599 struct _EPROCESS
*Process
,
600 PMMSUPPORT AddressSpace
,
606 MmMapMemoryArea(PVOID BaseAddress
,
611 /* npool.c *******************************************************************/
615 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
619 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
623 MiInitializeNonPagedPool(VOID
);
628 IN POOL_TYPE PoolType
,
629 IN SIZE_T SizeInBytes
635 IN PVOID VirtualAddress
641 IN PVOID StartingAddress
651 /* pool.c *******************************************************************/
655 ExAllocateNonPagedPoolWithTag(
664 ExAllocatePagedPoolWithTag(
672 ExFreeNonPagedPool(PVOID block
);
676 ExFreePagedPool(IN PVOID Block
);
680 ExpIsPoolTagDebuggable(ULONG Tag
);
684 ExpAllocateDebugPool(
694 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
698 MmInitializePagedPool(VOID
);
702 MiAllocateSpecialPool(
703 IN POOL_TYPE PoolType
,
704 IN SIZE_T NumberOfBytes
,
712 IN POOL_TYPE PoolType
,
713 IN ULONG CurrentMaxQuota
,
714 OUT PULONG NewMaxQuota
717 /* mdl.c *********************************************************************/
726 /* mminit.c ******************************************************************/
730 MiShutdownMemoryManager(VOID
);
740 MmInitSystem(IN ULONG Phase
,
741 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
745 MiFreeInitMemory(VOID
);
749 MmInitializeMdlImplementation(VOID
);
751 /* pagefile.c ****************************************************************/
755 MmAllocSwapPage(VOID
);
759 MmDereserveSwapPages(ULONG Nr
);
763 MmFreeSwapPage(SWAPENTRY Entry
);
767 MmInitPagingFile(VOID
);
778 MmReserveSwapPages(ULONG Nr
);
791 ULONG BugCodeParameter1
,
792 ULONG BugCodeParameter2
,
793 ULONG BugCodeParameter3
,
794 ULONG BugCodeParameter4
,
795 struct _KTRAP_FRAME
* TrapFrame
800 MmIsAvailableSwapPage(VOID
);
804 MmShowOutOfSpaceMessagePagingFile(VOID
);
806 /* process.c ****************************************************************/
810 MmInitializeProcessAddressSpace(
811 IN PEPROCESS Process
,
812 IN PEPROCESS Clone OPTIONAL
,
813 IN PVOID Section OPTIONAL
,
815 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
821 IN PEPROCESS Process
,
822 IN PINITIAL_PEB InitialPeb
,
829 IN PEPROCESS Process
,
830 IN PCLIENT_ID ClientId
,
831 IN PINITIAL_TEB InitialTeb
,
838 struct _EPROCESS
*Process
,
844 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
848 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
852 MmGetSessionLocaleId(VOID
);
856 MmSetMemoryPriorityProcess(
857 IN PEPROCESS Process
,
858 IN UCHAR MemoryPriority
861 /* i386/pfault.c *************************************************************/
873 /* mm.c **********************************************************************/
878 IN BOOLEAN StoreInstruction
,
880 IN KPROCESSOR_MODE Mode
,
881 IN PVOID TrapInformation
884 /* anonmem.c *****************************************************************/
888 MmNotPresentFaultVirtualMemory(
889 PMMSUPPORT AddressSpace
,
890 MEMORY_AREA
* MemoryArea
,
897 MmPageOutVirtualMemory(
898 PMMSUPPORT AddressSpace
,
899 PMEMORY_AREA MemoryArea
,
901 struct _MM_PAGEOP
* PageOp
907 PMEMORY_AREA MemoryArea
,
909 PMEMORY_BASIC_INFORMATION Info
,
916 struct _EPROCESS
* Process
,
917 PMEMORY_AREA MemoryArea
923 PMMSUPPORT AddressSpace
,
924 PMEMORY_AREA MemoryArea
,
933 MmWritePageVirtualMemory(
934 PMMSUPPORT AddressSpace
,
940 /* kmap.c ********************************************************************/
944 ExAllocatePage(VOID
);
948 ExUnmapPage(PVOID Addr
);
952 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
963 MiZeroPage(PFN_NUMBER Page
);
965 /* memsafe.s *****************************************************************/
969 MmSafeReadPtr(PVOID Source
);
971 /* pageop.c ******************************************************************/
975 MmReleasePageOp(PMM_PAGEOP PageOp
);
983 PMM_SECTION_SEGMENT Segment
,
995 PMM_SECTION_SEGMENT Segment
,
1001 MmInitializePageOp(VOID
);
1003 /* process.c *****************************************************************/
1007 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
1011 MmDeleteKernelStack(PVOID Stack
,
1014 /* balace.c ******************************************************************/
1018 MmInitializeMemoryConsumer(
1020 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
1025 MmInitializeBalancer(
1026 ULONG NrAvailablePages
,
1032 MmReleasePageMemoryConsumer(
1039 MmRequestPageMemoryConsumer(
1042 PPFN_NUMBER AllocatedPage
1047 MiInitBalancerThread(VOID
);
1051 MmRebalanceMemoryConsumers(VOID
);
1053 /* rmap.c **************************************************************/
1057 MmSetRmapListHeadPage(
1059 struct _MM_RMAP_ENTRY
* ListHead
1062 struct _MM_RMAP_ENTRY
*
1064 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1070 struct _EPROCESS
*Process
,
1079 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1086 struct _EPROCESS
*Process
,
1092 MmInitializeRmapList(VOID
);
1096 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1100 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1104 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1108 MmWritePagePhysicalAddress(PFN_NUMBER Page
);
1112 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1114 /* freelist.c **********************************************************/
1116 #define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0)
1120 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1123 extern RTL_BITMAP MiPfnBitMap
;
1125 /* Make sure the PFN number is valid */
1126 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1128 /* Make sure this page actually has a PFN entry */
1129 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, Pfn
))) return NULL
;
1132 Page
= &MmPfnDatabase
[Pfn
];
1134 /* Make sure it's valid */
1143 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1146 // This will return the Page Frame Number (PFN) from the MMPFN
1148 return Pfn1
- MmPfnDatabase
;
1153 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1157 MmGetLRUFirstUserPage(VOID
);
1161 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1165 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1169 MmLockPage(PFN_NUMBER Page
);
1173 MmUnlockPage(PFN_NUMBER Page
);
1177 MmGetLockCountPage(PFN_NUMBER Page
);
1181 MmInitializePageList(
1193 MmGetContinuousPages(
1194 ULONG NumberOfBytes
,
1195 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1196 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1197 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1203 MmZeroPageThreadMain(
1207 /* hypermap.c *****************************************************************/
1209 extern PEPROCESS HyperProcess
;
1210 extern KIRQL HyperIrql
;
1214 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1220 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1226 MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER
*Pages
,
1227 IN PFN_NUMBER NumberOfPages
);
1231 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1232 IN PFN_NUMBER NumberOfPages
);
1235 // ReactOS Compatibility Layer
1239 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1241 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1242 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1247 MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page
)
1249 return MiMapPagesToZeroInHyperSpace(&Page
, 1);
1252 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1254 /* i386/page.c *********************************************************/
1258 MmCreateVirtualMappingForKernel(
1267 MmCommitPagedPoolAddress(
1274 MmCreateVirtualMapping(
1275 struct _EPROCESS
* Process
,
1284 MmCreateVirtualMappingUnsafe(
1285 struct _EPROCESS
* Process
,
1295 struct _EPROCESS
* Process
,
1301 struct _EPROCESS
* Process
,
1309 struct _EPROCESS
* Process
,
1315 MmInitGlobalKernelPageDirectory(VOID
);
1319 MmDisableVirtualMapping(
1320 struct _EPROCESS
*Process
,
1328 MmEnableVirtualMapping(
1329 struct _EPROCESS
*Process
,
1335 MmRawDeleteVirtualMapping(PVOID Address
);
1339 MmDeletePageFileMapping(
1340 struct _EPROCESS
*Process
,
1342 SWAPENTRY
* SwapEntry
1347 MmCreatePageFileMapping(
1348 struct _EPROCESS
*Process
,
1356 struct _EPROCESS
*Process
,
1362 MmTransferOwnershipPage(
1370 struct _EPROCESS
*Process
,
1378 SWAPENTRY SavedSwapEntry
1383 MmAllocPagesSpecifyRange(
1385 PHYSICAL_ADDRESS LowestAddress
,
1386 PHYSICAL_ADDRESS HighestAddress
,
1387 ULONG NumberOfPages
,
1393 MmDereferencePage(PFN_NUMBER Page
);
1397 MmReferencePage(PFN_NUMBER Page
);
1401 MmGetReferenceCountPage(PFN_NUMBER Page
);
1405 MmIsPageInUse(PFN_NUMBER Page
);
1409 MmSetSavedSwapEntryPage(
1411 SWAPENTRY SavedSwapEntry
);
1415 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1420 struct _EPROCESS
*Process
,
1426 MmCreatePageTable(PVOID PAddress
);
1431 struct _EPROCESS
*Process
,
1438 struct _EPROCESS
*Process
,
1444 MmCreateProcessAddressSpace(
1447 IN PULONG_PTR DirectoryTableBase
1452 MmInitializeHandBuiltProcess(
1453 IN PEPROCESS Process
,
1454 IN PULONG_PTR DirectoryTableBase
1460 MmInitializeHandBuiltProcess2(
1461 IN PEPROCESS Process
1466 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1470 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1474 MmDeleteVirtualMapping(
1475 struct _EPROCESS
*Process
,
1485 struct _EPROCESS
*Process
,
1491 MmMarkPageMapped(PFN_NUMBER Page
);
1495 MmMarkPageUnmapped(PFN_NUMBER Page
);
1500 struct _EPROCESS
*Process
,
1507 MiInitPageDirectoryMap(VOID
);
1511 MiGetUserPageDirectoryCount(VOID
);
1513 /* wset.c ********************************************************************/
1522 /* region.c ************************************************************/
1527 PMMSUPPORT AddressSpace
,
1529 PLIST_ENTRY RegionListHead
,
1534 PMM_ALTER_REGION_FUNC AlterFunc
1540 PLIST_ENTRY RegionListHead
,
1550 PLIST_ENTRY RegionListHead
,
1552 PVOID
* RegionBaseAddress
1555 /* section.c *****************************************************************/
1559 MmGetFileObjectForSection(
1560 IN PROS_SECTION_OBJECT Section
1564 MmGetFileNameForAddress(
1566 OUT PUNICODE_STRING ModuleName
1571 MmGetFileNameForSection(
1572 IN PROS_SECTION_OBJECT Section
,
1573 OUT POBJECT_NAME_INFORMATION
*ModuleName
1586 PMEMORY_AREA MemoryArea
,
1588 PMEMORY_BASIC_INFORMATION Info
,
1589 PSIZE_T ResultLength
1594 MmProtectSectionView(
1595 PMMSUPPORT AddressSpace
,
1596 PMEMORY_AREA MemoryArea
,
1605 MmWritePageSectionView(
1606 PMMSUPPORT AddressSpace
,
1614 MmInitSectionImplementation(VOID
);
1618 MmNotPresentFaultSectionView(
1619 PMMSUPPORT AddressSpace
,
1620 MEMORY_AREA
* MemoryArea
,
1627 MmPageOutSectionView(
1628 PMMSUPPORT AddressSpace
,
1629 PMEMORY_AREA MemoryArea
,
1631 struct _MM_PAGEOP
*PageOp
1636 MmCreatePhysicalMemorySection(VOID
);
1640 MmAccessFaultSectionView(
1641 PMMSUPPORT AddressSpace
,
1642 MEMORY_AREA
* MemoryArea
,
1649 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1651 /* mpw.c *********************************************************************/
1655 MmInitMpwThread(VOID
);
1659 MmInitBsmThread(VOID
);
1661 /* pager.c *******************************************************************/
1665 MiIsPagerThread(VOID
);
1669 MiStartPagerThread(VOID
);
1673 MiStopPagerThread(VOID
);
1677 MiQueryVirtualMemory(
1678 IN HANDLE ProcessHandle
,
1680 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1681 OUT PVOID VirtualMemoryInformation
,
1683 OUT PSIZE_T ResultLength
1686 /* sysldr.c ******************************************************************/
1690 MiReloadBootLoadedDrivers(
1691 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1696 MiInitializeLoadedModuleList(
1697 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1703 IN PUNICODE_STRING FileName
,
1704 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1705 IN PUNICODE_STRING LoadedName OPTIONAL
,
1707 OUT PVOID
*ModuleObject
,
1708 OUT PVOID
*ImageBaseAddress
1713 MmUnloadSystemImage(
1714 IN PVOID ImageHandle
1720 IN HANDLE ImageHandle
,
1721 IN BOOLEAN PurgeSection
1726 MmCallDllInitialize(
1727 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1728 IN PLIST_ENTRY ListHead
1731 /* ReactOS Mm Hacks */
1734 MiSyncForProcessAttach(
1735 IN PKTHREAD NextThread
,
1736 IN PEPROCESS Process
1741 MiSyncForContextSwitch(
1745 extern PMMSUPPORT MmKernelAddressSpace
;
1749 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1751 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1756 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1758 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1763 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1765 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1766 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1771 MmGetCurrentAddressSpace(VOID
)
1773 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1778 MmGetKernelAddressSpace(VOID
)
1780 return MmKernelAddressSpace
;