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 KMUTANT MmSystemLoadLock
;
34 extern ULONG MmNumberOfPagingFiles
;
36 extern PVOID MmUnloadedDrivers
;
37 extern PVOID MmLastUnloadedDrivers
;
38 extern PVOID MmTriageActionTaken
;
39 extern PVOID KernelVerifier
;
40 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
42 extern SIZE_T MmTotalCommitLimit
;
43 extern SIZE_T MmTotalCommittedPages
;
44 extern SIZE_T MmSharedCommit
;
45 extern SIZE_T MmDriverCommit
;
46 extern SIZE_T MmProcessCommit
;
47 extern SIZE_T MmPagedPoolCommit
;
48 extern SIZE_T MmPeakCommitment
;
49 extern SIZE_T MmtotalCommitLimitMaximum
;
51 extern PVOID MiDebugMapping
;
52 extern PMMPTE MmDebugPte
;
56 struct _MM_RMAP_ENTRY
;
58 typedef ULONG SWAPENTRY
;
61 // MmDbgCopyMemory Flags
63 #define MMDBG_COPY_WRITE 0x00000001
64 #define MMDBG_COPY_PHYSICAL 0x00000002
65 #define MMDBG_COPY_UNSAFE 0x00000004
66 #define MMDBG_COPY_CACHED 0x00000008
67 #define MMDBG_COPY_UNCACHED 0x00000010
68 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
71 // Maximum chunk size per copy
73 #define MMDBG_COPY_MAX_SIZE 0x8
76 #define MI_STATIC_MEMORY_AREAS (14)
78 #define MI_STATIC_MEMORY_AREAS (13)
81 #define MEMORY_AREA_INVALID (0)
82 #define MEMORY_AREA_SECTION_VIEW (1)
83 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
84 #define MEMORY_AREA_NO_CACHE (3)
85 #define MEMORY_AREA_IO_MAPPING (4)
86 #define MEMORY_AREA_SYSTEM (5)
87 #define MEMORY_AREA_MDL_MAPPING (7)
88 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
89 #define MEMORY_AREA_CACHE_SEGMENT (9)
90 #define MEMORY_AREA_SHARED_DATA (10)
91 #define MEMORY_AREA_KERNEL_STACK (11)
92 #define MEMORY_AREA_PAGED_POOL (12)
93 #define MEMORY_AREA_NO_ACCESS (13)
94 #define MEMORY_AREA_PEB_OR_TEB (14)
95 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
96 #define MEMORY_AREA_STATIC (0x80000000)
98 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
100 #define MM_CORE_DUMP_TYPE_NONE (0x0)
101 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
102 #define MM_CORE_DUMP_TYPE_FULL (0x2)
104 #define MM_PAGEOP_PAGEIN (1)
105 #define MM_PAGEOP_PAGEOUT (2)
106 #define MM_PAGEOP_PAGESYNCH (3)
107 #define MM_PAGEOP_ACCESSFAULT (4)
109 /* Number of list heads to use */
110 #define MI_FREE_POOL_LISTS 4
112 #define MI_HYPERSPACE_PTES (256 - 1)
113 #define MI_ZERO_PTES (32)
114 #define MI_MAPPING_RANGE_START (ULONG_PTR)HYPER_SPACE
115 #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
116 MI_HYPERSPACE_PTES * PAGE_SIZE)
117 #define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \
120 /* Signature of free pool blocks */
121 #define MM_FREE_POOL_TAG 'lprF'
123 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
124 ((x) / (4*1024*1024))
126 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
127 ((((x)) % (4*1024*1024)) / (4*1024))
129 #define NR_SECTION_PAGE_TABLES 1024
130 #define NR_SECTION_PAGE_ENTRIES 1024
132 #define TEB_BASE 0x7FFDE000
134 /* Although Microsoft says this isn't hardcoded anymore,
135 they won't be able to change it. Stuff depends on it */
136 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
138 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
141 * Additional flags for protection attributes
143 #define PAGE_WRITETHROUGH (1024)
144 #define PAGE_SYSTEM (2048)
146 #define SEC_PHYSICALMEMORY (0x80000000)
148 #define MM_PAGEFILE_SEGMENT (0x1)
149 #define MM_DATAFILE_SEGMENT (0x2)
154 #define MC_NPPOOL (3)
155 #define MC_SYSTEM (4)
156 #define MC_MAXIMUM (5)
158 #define PAGED_POOL_MASK 1
159 #define MUST_SUCCEED_POOL_MASK 2
160 #define CACHE_ALIGNED_POOL_MASK 4
161 #define QUOTA_POOL_MASK 8
162 #define SESSION_POOL_MASK 32
163 #define VERIFIER_POOL_MASK 64
165 #define MM_PAGED_POOL_SIZE (100*1024*1024)
166 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
169 * Paged and non-paged pools are 8-byte aligned
171 #define MM_POOL_ALIGNMENT 8
174 * Maximum size of the kmalloc area (this is totally arbitary)
176 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
177 #define MM_KERNEL_MAP_BASE (0xf0c00000)
180 * FIXME - different architectures have different cache line sizes...
182 #define MM_CACHE_LINE_SIZE 32
184 #define MM_ROUND_UP(x,s) \
185 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
187 #define MM_ROUND_DOWN(x,s) \
188 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
190 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
195 PAGE_EXECUTE_READ | \
196 PAGE_EXECUTE_READWRITE | \
197 PAGE_EXECUTE_WRITECOPY | \
202 #define PAGE_FLAGS_VALID_FOR_SECTION \
207 PAGE_EXECUTE_READ | \
208 PAGE_EXECUTE_READWRITE | \
209 PAGE_EXECUTE_WRITECOPY | \
212 #define PAGE_IS_READABLE \
216 PAGE_EXECUTE_READ | \
217 PAGE_EXECUTE_READWRITE | \
218 PAGE_EXECUTE_WRITECOPY)
220 #define PAGE_IS_WRITABLE \
223 PAGE_EXECUTE_READWRITE | \
224 PAGE_EXECUTE_WRITECOPY)
226 #define PAGE_IS_EXECUTABLE \
228 PAGE_EXECUTE_READ | \
229 PAGE_EXECUTE_READWRITE | \
230 PAGE_EXECUTE_WRITECOPY)
232 #define PAGE_IS_WRITECOPY \
234 PAGE_EXECUTE_WRITECOPY)
236 #define MI_PFN_ELEMENT(Pfn) (&MmPfnDatabase[Pfn])
238 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
239 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
241 #define InterlockedExchangePte(PointerPte, Value) \
242 InterlockedExchange((PLONG)(PointerPte), Value)
246 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
247 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
251 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
252 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
254 typedef struct _MM_SECTION_SEGMENT
256 LONG FileOffset
; /* start offset into the file for image sections */
257 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
258 ULONG RawLength
; /* length of the segment which is part of the mapped file */
259 ULONG Length
; /* absolute length of the segment */
261 FAST_MUTEX Lock
; /* lock which protects the page directory */
262 ULONG ReferenceCount
;
263 SECTION_PAGE_DIRECTORY PageDirectory
;
265 ULONG Characteristics
;
267 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
269 typedef struct _MM_IMAGE_SECTION_OBJECT
272 ULONG_PTR StackReserve
;
273 ULONG_PTR StackCommit
;
274 ULONG_PTR EntryPoint
;
276 USHORT ImageCharacteristics
;
277 USHORT MinorSubsystemVersion
;
278 USHORT MajorSubsystemVersion
;
283 PMM_SECTION_SEGMENT Segments
;
284 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
286 typedef struct _ROS_SECTION_OBJECT
290 LARGE_INTEGER MaximumSize
;
291 ULONG SectionPageProtection
;
292 ULONG AllocationAttributes
;
293 PFILE_OBJECT FileObject
;
296 PMM_IMAGE_SECTION_OBJECT ImageSection
;
297 PMM_SECTION_SEGMENT Segment
;
299 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
301 typedef struct _MEMORY_AREA
303 PVOID StartingAddress
;
305 struct _MEMORY_AREA
*Parent
;
306 struct _MEMORY_AREA
*LeftChild
;
307 struct _MEMORY_AREA
*RightChild
;
311 BOOLEAN DeleteInProgress
;
317 ROS_SECTION_OBJECT
* Section
;
319 PMM_SECTION_SEGMENT Segment
;
320 BOOLEAN WriteCopyView
;
321 LIST_ENTRY RegionListHead
;
325 LIST_ENTRY RegionListHead
;
328 } MEMORY_AREA
, *PMEMORY_AREA
;
331 // These two mappings are actually used by Windows itself, based on the ASSERTS
333 #define StartOfAllocation ReadInProgress
334 #define EndOfAllocation WriteInProgress
336 typedef struct _MMPFNENTRY
339 USHORT ReadInProgress
:1; // StartOfAllocation
340 USHORT WriteInProgress
:1; // EndOfAllocation
341 USHORT PrototypePte
:1; // Zero
342 USHORT PageColor
:4; // LockCount
343 USHORT PageLocation
:3; // Consumer
344 USHORT RemovalRequested
:1;
345 USHORT CacheAttribute
:2; // Type
347 USHORT ParityError
:1;
350 typedef struct _MMPFN
354 PFN_NUMBER Flink
; // ListEntry.Flink
358 SINGLE_LIST_ENTRY NextStackPfn
;
360 PMMPTE PteAddress
; // ListEntry.Blink
364 ULONG_PTR ShareCount
; // MapCount
370 USHORT ReferenceCount
; // ReferenceCount
375 USHORT ReferenceCount
;
380 ULONG UsedPageTableEntries
;
385 LONG AweReferenceCount
; // RmapListHead
389 ULONG_PTR EntireFrame
; // SavedSwapEntry
392 ULONG_PTR PteFrame
: 8*sizeof(PVOID
)-7;
393 ULONG_PTR InPageError
:1;
394 ULONG_PTR VerifierAllocation
:1;
395 ULONG_PTR AweAllocation
:1;
396 ULONG_PTR Priority
:3;
397 ULONG_PTR MustBeCached
:1;
402 extern PMMPFN MmPfnDatabase
;
404 typedef struct _MMPFNLIST
410 } MMPFNLIST
, *PMMPFNLIST
;
412 extern MMPFNLIST MmZeroedPageListHead
;
413 extern MMPFNLIST MmFreePageListHead
;
414 extern MMPFNLIST MmStandbyPageListHead
;
415 extern MMPFNLIST MmModifiedPageListHead
;
416 extern MMPFNLIST MmModifiedNoWritePageListHead
;
418 typedef struct _MM_PAGEOP
420 /* Type of operation. */
422 /* Number of threads interested in this operation. */
423 ULONG ReferenceCount
;
424 /* Event that will be set when the operation is completed. */
425 KEVENT CompletionEvent
;
426 /* Status of the operation once it is completed. */
428 /* TRUE if the operation was abandoned. */
430 /* The memory area to be affected by the operation. */
433 struct _MM_PAGEOP
* Next
;
434 struct _ETHREAD
* Thread
;
436 * These fields are used to identify the operation if it is against a
437 * virtual memory area.
442 * These fields are used to identify the operation if it is against a
445 PMM_SECTION_SEGMENT Segment
;
447 } MM_PAGEOP
, *PMM_PAGEOP
;
449 typedef struct _MM_MEMORY_CONSUMER
453 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
454 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
456 typedef struct _MM_REGION
461 LIST_ENTRY RegionListEntry
;
462 } MM_REGION
, *PMM_REGION
;
464 /* Entry describing free pool memory */
465 typedef struct _MMFREE_POOL_ENTRY
470 struct _MMFREE_POOL_ENTRY
*Owner
;
471 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
473 /* Paged pool information */
474 typedef struct _MM_PAGED_POOL_INFO
476 PRTL_BITMAP PagedPoolAllocationMap
;
477 PRTL_BITMAP EndOfPagedPoolBitmap
;
478 PMMPTE FirstPteForPagedPool
;
479 PMMPTE LastPteForPagedPool
;
480 PMMPTE NextPdeForPagedPoolExpansion
;
482 SIZE_T PagedPoolCommit
;
483 SIZE_T AllocatedPagedPool
;
484 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
486 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
489 (*PMM_ALTER_REGION_FUNC
)(
490 PMMSUPPORT AddressSpace
,
500 (*PMM_FREE_PAGE_FUNC
)(
502 PMEMORY_AREA MemoryArea
,
510 // Mm copy support for Kd
522 // Determines if a given address is a session address
530 /* marea.c *******************************************************************/
535 PMMSUPPORT AddressSpace
,
540 PMEMORY_AREA
*Result
,
541 BOOLEAN FixedAddress
,
542 ULONG AllocationFlags
,
543 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
548 MmLocateMemoryAreaByAddress(
549 PMMSUPPORT AddressSpace
,
556 PMMSUPPORT AddressSpace
,
563 PMMSUPPORT AddressSpace
,
564 PMEMORY_AREA MemoryArea
,
565 PMM_FREE_PAGE_FUNC FreePage
,
566 PVOID FreePageContext
571 MmFreeMemoryAreaByPtr(
572 PMMSUPPORT AddressSpace
,
574 PMM_FREE_PAGE_FUNC FreePage
,
575 PVOID FreePageContext
580 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
584 MmLocateMemoryAreaByRegion(
585 PMMSUPPORT AddressSpace
,
593 PMMSUPPORT AddressSpace
,
595 ULONG_PTR Granularity
,
601 MmReleaseMemoryAreaIfDecommitted(
602 struct _EPROCESS
*Process
,
603 PMMSUPPORT AddressSpace
,
609 MmMapMemoryArea(PVOID BaseAddress
,
614 /* npool.c *******************************************************************/
618 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
622 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
626 MiInitializeNonPagedPool(VOID
);
631 IN POOL_TYPE PoolType
,
632 IN SIZE_T SizeInBytes
638 IN PVOID VirtualAddress
644 IN PVOID StartingAddress
654 /* pool.c *******************************************************************/
658 ExAllocateNonPagedPoolWithTag(
667 ExAllocatePagedPoolWithTag(
675 ExFreeNonPagedPool(PVOID block
);
679 ExFreePagedPool(IN PVOID Block
);
683 ExpIsPoolTagDebuggable(ULONG Tag
);
687 ExpAllocateDebugPool(
697 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
701 MmInitializePagedPool(VOID
);
705 MiAllocateSpecialPool(
706 IN POOL_TYPE PoolType
,
707 IN SIZE_T NumberOfBytes
,
715 IN POOL_TYPE PoolType
,
716 IN ULONG CurrentMaxQuota
,
717 OUT PULONG NewMaxQuota
720 /* mdl.c *********************************************************************/
729 /* mminit.c ******************************************************************/
733 MiShutdownMemoryManager(VOID
);
743 MmInitSystem(IN ULONG Phase
,
744 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
748 MiFreeInitMemory(VOID
);
752 MmInitializeMdlImplementation(VOID
);
754 /* pagefile.c ****************************************************************/
758 MmAllocSwapPage(VOID
);
762 MmDereserveSwapPages(ULONG Nr
);
766 MmFreeSwapPage(SWAPENTRY Entry
);
770 MmInitPagingFile(VOID
);
781 MmReserveSwapPages(ULONG Nr
);
794 ULONG BugCodeParameter1
,
795 ULONG BugCodeParameter2
,
796 ULONG BugCodeParameter3
,
797 ULONG BugCodeParameter4
,
798 struct _KTRAP_FRAME
* TrapFrame
803 MmIsAvailableSwapPage(VOID
);
807 MmShowOutOfSpaceMessagePagingFile(VOID
);
809 /* process.c ****************************************************************/
813 MmInitializeProcessAddressSpace(
814 IN PEPROCESS Process
,
815 IN PEPROCESS Clone OPTIONAL
,
816 IN PVOID Section OPTIONAL
,
818 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
824 IN PEPROCESS Process
,
825 IN PINITIAL_PEB InitialPeb
,
832 IN PEPROCESS Process
,
833 IN PCLIENT_ID ClientId
,
834 IN PINITIAL_TEB InitialTeb
,
841 struct _EPROCESS
*Process
,
847 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
851 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
855 MmGetSessionLocaleId(VOID
);
859 MmSetMemoryPriorityProcess(
860 IN PEPROCESS Process
,
861 IN UCHAR MemoryPriority
864 /* i386/pfault.c *************************************************************/
876 /* mm.c **********************************************************************/
881 IN BOOLEAN StoreInstruction
,
883 IN KPROCESSOR_MODE Mode
,
884 IN PVOID TrapInformation
887 /* anonmem.c *****************************************************************/
891 MmNotPresentFaultVirtualMemory(
892 PMMSUPPORT AddressSpace
,
893 MEMORY_AREA
* MemoryArea
,
900 MmPageOutVirtualMemory(
901 PMMSUPPORT AddressSpace
,
902 PMEMORY_AREA MemoryArea
,
904 struct _MM_PAGEOP
* PageOp
910 PMEMORY_AREA MemoryArea
,
912 PMEMORY_BASIC_INFORMATION Info
,
919 struct _EPROCESS
* Process
,
920 PMEMORY_AREA MemoryArea
926 PMMSUPPORT AddressSpace
,
927 PMEMORY_AREA MemoryArea
,
936 MmWritePageVirtualMemory(
937 PMMSUPPORT AddressSpace
,
943 /* kmap.c ********************************************************************/
947 ExAllocatePage(VOID
);
951 ExUnmapPage(PVOID Addr
);
955 ExAllocatePageWithPhysPage(PFN_NUMBER Page
);
966 MiZeroPage(PFN_NUMBER Page
);
968 /* memsafe.s *****************************************************************/
972 MmSafeReadPtr(PVOID Source
);
974 /* pageop.c ******************************************************************/
978 MmReleasePageOp(PMM_PAGEOP PageOp
);
986 PMM_SECTION_SEGMENT Segment
,
998 PMM_SECTION_SEGMENT Segment
,
1004 MmInitializePageOp(VOID
);
1006 /* process.c *****************************************************************/
1010 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
1014 MmDeleteKernelStack(PVOID Stack
,
1017 /* balace.c ******************************************************************/
1021 MmInitializeMemoryConsumer(
1023 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
1028 MmInitializeBalancer(
1029 ULONG NrAvailablePages
,
1035 MmReleasePageMemoryConsumer(
1042 MmRequestPageMemoryConsumer(
1045 PPFN_NUMBER AllocatedPage
1050 MiInitBalancerThread(VOID
);
1054 MmRebalanceMemoryConsumers(VOID
);
1056 /* rmap.c **************************************************************/
1060 MmSetRmapListHeadPage(
1062 struct _MM_RMAP_ENTRY
* ListHead
1065 struct _MM_RMAP_ENTRY
*
1067 MmGetRmapListHeadPage(PFN_NUMBER Page
);
1073 struct _EPROCESS
*Process
,
1082 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1089 struct _EPROCESS
*Process
,
1095 MmInitializeRmapList(VOID
);
1099 MmSetCleanAllRmaps(PFN_NUMBER Page
);
1103 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
1107 MmIsDirtyPageRmap(PFN_NUMBER Page
);
1111 MmWritePagePhysicalAddress(PFN_NUMBER Page
);
1115 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
1117 /* freelist.c **********************************************************/
1119 #define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0)
1123 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
1126 extern RTL_BITMAP MiPfnBitMap
;
1128 /* Make sure the PFN number is valid */
1129 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1131 /* Make sure this page actually has a PFN entry */
1132 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, Pfn
))) return NULL
;
1135 Page
= &MmPfnDatabase
[Pfn
];
1137 /* Make sure it's valid */
1146 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1149 // This will return the Page Frame Number (PFN) from the MMPFN
1151 return Pfn1
- MmPfnDatabase
;
1156 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
1160 MmGetLRUFirstUserPage(VOID
);
1164 MmInsertLRULastUserPage(PFN_NUMBER Page
);
1168 MmRemoveLRUUserPage(PFN_NUMBER Page
);
1172 MmLockPage(PFN_NUMBER Page
);
1176 MmUnlockPage(PFN_NUMBER Page
);
1180 MmGetLockCountPage(PFN_NUMBER Page
);
1184 MmInitializePageList(
1196 MmGetContinuousPages(
1197 ULONG NumberOfBytes
,
1198 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1199 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1200 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1206 MmZeroPageThreadMain(
1210 /* hypermap.c *****************************************************************/
1212 extern PEPROCESS HyperProcess
;
1213 extern KIRQL HyperIrql
;
1217 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1223 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1229 MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER
*Pages
,
1230 IN PFN_NUMBER NumberOfPages
);
1234 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1235 IN PFN_NUMBER NumberOfPages
);
1238 // ReactOS Compatibility Layer
1242 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1244 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1245 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1250 MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page
)
1252 return MiMapPagesToZeroInHyperSpace(&Page
, 1);
1255 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1257 /* i386/page.c *********************************************************/
1261 MmCreateVirtualMappingForKernel(
1270 MmCommitPagedPoolAddress(
1277 MmCreateVirtualMapping(
1278 struct _EPROCESS
* Process
,
1287 MmCreateVirtualMappingUnsafe(
1288 struct _EPROCESS
* Process
,
1298 struct _EPROCESS
* Process
,
1304 struct _EPROCESS
* Process
,
1312 struct _EPROCESS
* Process
,
1318 MmInitGlobalKernelPageDirectory(VOID
);
1322 MmDisableVirtualMapping(
1323 struct _EPROCESS
*Process
,
1331 MmEnableVirtualMapping(
1332 struct _EPROCESS
*Process
,
1338 MmRawDeleteVirtualMapping(PVOID Address
);
1342 MmDeletePageFileMapping(
1343 struct _EPROCESS
*Process
,
1345 SWAPENTRY
* SwapEntry
1350 MmCreatePageFileMapping(
1351 struct _EPROCESS
*Process
,
1359 struct _EPROCESS
*Process
,
1365 MmTransferOwnershipPage(
1373 struct _EPROCESS
*Process
,
1381 SWAPENTRY SavedSwapEntry
1386 MmAllocPagesSpecifyRange(
1388 PHYSICAL_ADDRESS LowestAddress
,
1389 PHYSICAL_ADDRESS HighestAddress
,
1390 ULONG NumberOfPages
,
1396 MmDereferencePage(PFN_NUMBER Page
);
1400 MmReferencePage(PFN_NUMBER Page
);
1404 MmGetReferenceCountPage(PFN_NUMBER Page
);
1408 MmIsPageInUse(PFN_NUMBER Page
);
1412 MmSetSavedSwapEntryPage(
1414 SWAPENTRY SavedSwapEntry
);
1418 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1423 struct _EPROCESS
*Process
,
1429 MmCreatePageTable(PVOID PAddress
);
1434 struct _EPROCESS
*Process
,
1441 struct _EPROCESS
*Process
,
1447 MmCreateProcessAddressSpace(
1450 IN PULONG_PTR DirectoryTableBase
1455 MmInitializeHandBuiltProcess(
1456 IN PEPROCESS Process
,
1457 IN PULONG_PTR DirectoryTableBase
1463 MmInitializeHandBuiltProcess2(
1464 IN PEPROCESS Process
1469 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1473 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1477 MmDeleteVirtualMapping(
1478 struct _EPROCESS
*Process
,
1488 struct _EPROCESS
*Process
,
1494 MmMarkPageMapped(PFN_NUMBER Page
);
1498 MmMarkPageUnmapped(PFN_NUMBER Page
);
1503 struct _EPROCESS
*Process
,
1510 MiInitPageDirectoryMap(VOID
);
1514 MiGetUserPageDirectoryCount(VOID
);
1516 /* wset.c ********************************************************************/
1525 /* region.c ************************************************************/
1530 PMMSUPPORT AddressSpace
,
1532 PLIST_ENTRY RegionListHead
,
1537 PMM_ALTER_REGION_FUNC AlterFunc
1543 PLIST_ENTRY RegionListHead
,
1553 PLIST_ENTRY RegionListHead
,
1555 PVOID
* RegionBaseAddress
1558 /* section.c *****************************************************************/
1562 MmGetFileObjectForSection(
1563 IN PROS_SECTION_OBJECT Section
1567 MmGetFileNameForAddress(
1569 OUT PUNICODE_STRING ModuleName
1574 MmGetFileNameForSection(
1575 IN PROS_SECTION_OBJECT Section
,
1576 OUT POBJECT_NAME_INFORMATION
*ModuleName
1595 PMEMORY_AREA MemoryArea
,
1597 PMEMORY_BASIC_INFORMATION Info
,
1598 PSIZE_T ResultLength
1603 MmProtectSectionView(
1604 PMMSUPPORT AddressSpace
,
1605 PMEMORY_AREA MemoryArea
,
1614 MmWritePageSectionView(
1615 PMMSUPPORT AddressSpace
,
1623 MmInitSectionImplementation(VOID
);
1627 MmNotPresentFaultSectionView(
1628 PMMSUPPORT AddressSpace
,
1629 MEMORY_AREA
* MemoryArea
,
1636 MmPageOutSectionView(
1637 PMMSUPPORT AddressSpace
,
1638 PMEMORY_AREA MemoryArea
,
1640 struct _MM_PAGEOP
*PageOp
1645 MmCreatePhysicalMemorySection(VOID
);
1649 MmAccessFaultSectionView(
1650 PMMSUPPORT AddressSpace
,
1651 MEMORY_AREA
* MemoryArea
,
1658 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1660 /* mpw.c *********************************************************************/
1664 MmInitMpwThread(VOID
);
1668 MmInitBsmThread(VOID
);
1670 /* pager.c *******************************************************************/
1674 MiIsPagerThread(VOID
);
1678 MiStartPagerThread(VOID
);
1682 MiStopPagerThread(VOID
);
1686 MiQueryVirtualMemory(
1687 IN HANDLE ProcessHandle
,
1689 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1690 OUT PVOID VirtualMemoryInformation
,
1692 OUT PSIZE_T ResultLength
1695 /* sysldr.c ******************************************************************/
1699 MiReloadBootLoadedDrivers(
1700 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1705 MiInitializeLoadedModuleList(
1706 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1712 IN PUNICODE_STRING FileName
,
1713 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1714 IN PUNICODE_STRING LoadedName OPTIONAL
,
1716 OUT PVOID
*ModuleObject
,
1717 OUT PVOID
*ImageBaseAddress
1722 MmUnloadSystemImage(
1723 IN PVOID ImageHandle
1729 IN HANDLE ImageHandle
,
1730 IN BOOLEAN PurgeSection
1735 MmCallDllInitialize(
1736 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1737 IN PLIST_ENTRY ListHead
1740 /* ReactOS Mm Hacks */
1743 MiSyncForProcessAttach(
1744 IN PKTHREAD NextThread
,
1745 IN PEPROCESS Process
1750 MiSyncForContextSwitch(
1754 extern PMMSUPPORT MmKernelAddressSpace
;
1758 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1760 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1765 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1767 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1772 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1774 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1775 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1780 MmGetCurrentAddressSpace(VOID
)
1782 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1787 MmGetKernelAddressSpace(VOID
)
1789 return MmKernelAddressSpace
;