3 #include <internal/arch/mm.h>
5 /* TYPES *********************************************************************/
9 extern ULONG MiFreeSwapPages
;
10 extern ULONG MiUsedSwapPages
;
11 extern ULONG MmPagedPoolSize
;
12 extern ULONG MmTotalPagedPoolQuota
;
13 extern ULONG MmTotalNonPagedPoolQuota
;
14 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
15 extern ULONG MmNumberOfPhysicalPages
;
16 extern UCHAR MmDisablePagingExecutive
;
17 extern ULONG MmLowestPhysicalPage
;
18 extern ULONG MmHighestPhysicalPage
;
19 extern ULONG MmAvailablePages
;
20 extern ULONG MmResidentAvailablePages
;
22 extern PVOID MmPagedPoolBase
;
23 extern ULONG MmPagedPoolSize
;
25 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
26 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
28 extern LIST_ENTRY MmLoadedUserImageList
;
30 extern KMUTANT MmSystemLoadLock
;
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 BOOLEAN MiDbgReadyForPhysical
;
53 struct _MM_RMAP_ENTRY
;
55 typedef ULONG SWAPENTRY
;
56 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
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
111 /* Signature of free pool blocks */
112 #define MM_FREE_POOL_TAG 'lprF'
114 /* Although Microsoft says this isn't hardcoded anymore,
115 they won't be able to change it. Stuff depends on it */
116 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
118 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
121 * Additional flags for protection attributes
123 #define PAGE_WRITETHROUGH (1024)
124 #define PAGE_SYSTEM (2048)
126 #define SEC_PHYSICALMEMORY (0x80000000)
128 #define MM_PAGEFILE_SEGMENT (0x1)
129 #define MM_DATAFILE_SEGMENT (0x2)
134 #define MC_NPPOOL (3)
135 #define MC_SYSTEM (4)
136 #define MC_MAXIMUM (5)
138 #define PAGED_POOL_MASK 1
139 #define MUST_SUCCEED_POOL_MASK 2
140 #define CACHE_ALIGNED_POOL_MASK 4
141 #define QUOTA_POOL_MASK 8
142 #define SESSION_POOL_MASK 32
143 #define VERIFIER_POOL_MASK 64
145 #define MM_PAGED_POOL_SIZE (100*1024*1024)
146 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
149 * Paged and non-paged pools are 8-byte aligned
151 #define MM_POOL_ALIGNMENT 8
153 #define MM_ROUND_UP(x,s) \
154 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
156 #define MM_ROUND_DOWN(x,s) \
157 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
159 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
164 PAGE_EXECUTE_READ | \
165 PAGE_EXECUTE_READWRITE | \
166 PAGE_EXECUTE_WRITECOPY | \
171 #define PAGE_FLAGS_VALID_FOR_SECTION \
176 PAGE_EXECUTE_READ | \
177 PAGE_EXECUTE_READWRITE | \
178 PAGE_EXECUTE_WRITECOPY | \
181 #define PAGE_IS_READABLE \
185 PAGE_EXECUTE_READ | \
186 PAGE_EXECUTE_READWRITE | \
187 PAGE_EXECUTE_WRITECOPY)
189 #define PAGE_IS_WRITABLE \
192 PAGE_EXECUTE_READWRITE | \
193 PAGE_EXECUTE_WRITECOPY)
195 #define PAGE_IS_EXECUTABLE \
197 PAGE_EXECUTE_READ | \
198 PAGE_EXECUTE_READWRITE | \
199 PAGE_EXECUTE_WRITECOPY)
201 #define PAGE_IS_WRITECOPY \
203 PAGE_EXECUTE_WRITECOPY)
206 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
207 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
209 #define InterlockedExchangePte(PointerPte, Value) \
210 InterlockedExchange((PLONG)(PointerPte), Value)
214 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
215 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
219 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
220 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
222 typedef struct _MM_SECTION_SEGMENT
224 LONG FileOffset
; /* start offset into the file for image sections */
225 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
226 ULONG RawLength
; /* length of the segment which is part of the mapped file */
227 ULONG Length
; /* absolute length of the segment */
229 FAST_MUTEX Lock
; /* lock which protects the page directory */
230 ULONG ReferenceCount
;
231 SECTION_PAGE_DIRECTORY PageDirectory
;
233 ULONG Characteristics
;
235 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
237 typedef struct _MM_IMAGE_SECTION_OBJECT
240 ULONG_PTR StackReserve
;
241 ULONG_PTR StackCommit
;
242 ULONG_PTR EntryPoint
;
244 USHORT ImageCharacteristics
;
245 USHORT MinorSubsystemVersion
;
246 USHORT MajorSubsystemVersion
;
251 PMM_SECTION_SEGMENT Segments
;
252 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
254 typedef struct _ROS_SECTION_OBJECT
258 LARGE_INTEGER MaximumSize
;
259 ULONG SectionPageProtection
;
260 ULONG AllocationAttributes
;
261 PFILE_OBJECT FileObject
;
264 PMM_IMAGE_SECTION_OBJECT ImageSection
;
265 PMM_SECTION_SEGMENT Segment
;
267 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
269 typedef struct _MEMORY_AREA
271 PVOID StartingAddress
;
273 struct _MEMORY_AREA
*Parent
;
274 struct _MEMORY_AREA
*LeftChild
;
275 struct _MEMORY_AREA
*RightChild
;
279 BOOLEAN DeleteInProgress
;
285 ROS_SECTION_OBJECT
* Section
;
287 PMM_SECTION_SEGMENT Segment
;
288 BOOLEAN WriteCopyView
;
289 LIST_ENTRY RegionListHead
;
293 LIST_ENTRY RegionListHead
;
296 } MEMORY_AREA
, *PMEMORY_AREA
;
299 // These two mappings are actually used by Windows itself, based on the ASSERTS
301 #define StartOfAllocation ReadInProgress
302 #define EndOfAllocation WriteInProgress
304 typedef struct _MMPFNENTRY
307 USHORT ReadInProgress
:1; // StartOfAllocation
308 USHORT WriteInProgress
:1; // EndOfAllocation
309 USHORT PrototypePte
:1; // Zero
310 USHORT PageColor
:4; // LockCount
311 USHORT PageLocation
:3; // Consumer
312 USHORT RemovalRequested
:1;
313 USHORT CacheAttribute
:2; // Type
315 USHORT ParityError
:1;
318 typedef struct _MMPFN
322 PFN_NUMBER Flink
; // ListEntry.Flink
326 SINGLE_LIST_ENTRY NextStackPfn
;
328 PMMPTE PteAddress
; // ListEntry.Blink
332 ULONG_PTR ShareCount
; // MapCount
338 USHORT ReferenceCount
; // ReferenceCount
343 USHORT ReferenceCount
;
350 LONG AweReferenceCount
; // RmapListHead
354 ULONG_PTR EntireFrame
; // SavedSwapEntry
357 ULONG_PTR PteFrame
:25;
358 ULONG_PTR InPageError
:1;
359 ULONG_PTR VerifierAllocation
:1;
360 ULONG_PTR AweAllocation
:1;
361 ULONG_PTR Priority
:3;
362 ULONG_PTR MustBeCached
:1;
367 extern PMMPFN MmPfnDatabase
[2];
369 typedef struct _MMPFNLIST
375 } MMPFNLIST
, *PMMPFNLIST
;
377 extern MMPFNLIST MmZeroedPageListHead
;
378 extern MMPFNLIST MmFreePageListHead
;
379 extern MMPFNLIST MmStandbyPageListHead
;
380 extern MMPFNLIST MmModifiedPageListHead
;
381 extern MMPFNLIST MmModifiedNoWritePageListHead
;
383 typedef struct _MM_PAGEOP
385 /* Type of operation. */
387 /* Number of threads interested in this operation. */
388 ULONG ReferenceCount
;
389 /* Event that will be set when the operation is completed. */
390 KEVENT CompletionEvent
;
391 /* Status of the operation once it is completed. */
393 /* TRUE if the operation was abandoned. */
395 /* The memory area to be affected by the operation. */
398 struct _MM_PAGEOP
* Next
;
399 struct _ETHREAD
* Thread
;
401 * These fields are used to identify the operation if it is against a
402 * virtual memory area.
407 * These fields are used to identify the operation if it is against a
410 PMM_SECTION_SEGMENT Segment
;
412 } MM_PAGEOP
, *PMM_PAGEOP
;
414 typedef struct _MM_MEMORY_CONSUMER
418 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
419 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
421 typedef struct _MM_REGION
426 LIST_ENTRY RegionListEntry
;
427 } MM_REGION
, *PMM_REGION
;
429 /* Entry describing free pool memory */
430 typedef struct _MMFREE_POOL_ENTRY
435 struct _MMFREE_POOL_ENTRY
*Owner
;
436 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
438 /* Paged pool information */
439 typedef struct _MM_PAGED_POOL_INFO
441 PRTL_BITMAP PagedPoolAllocationMap
;
442 PRTL_BITMAP EndOfPagedPoolBitmap
;
443 PMMPTE FirstPteForPagedPool
;
444 PMMPTE LastPteForPagedPool
;
445 PMMPTE NextPdeForPagedPoolExpansion
;
447 SIZE_T PagedPoolCommit
;
448 SIZE_T AllocatedPagedPool
;
449 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
451 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
454 (*PMM_ALTER_REGION_FUNC
)(
455 PMMSUPPORT AddressSpace
,
465 (*PMM_FREE_PAGE_FUNC
)(
467 PMEMORY_AREA MemoryArea
,
475 // Mm copy support for Kd
487 // Determines if a given address is a session address
495 /* marea.c *******************************************************************/
500 PMMSUPPORT AddressSpace
,
505 PMEMORY_AREA
*Result
,
506 BOOLEAN FixedAddress
,
507 ULONG AllocationFlags
,
508 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
513 MmLocateMemoryAreaByAddress(
514 PMMSUPPORT AddressSpace
,
521 PMMSUPPORT AddressSpace
,
528 PMMSUPPORT AddressSpace
,
529 PMEMORY_AREA MemoryArea
,
530 PMM_FREE_PAGE_FUNC FreePage
,
531 PVOID FreePageContext
536 MmFreeMemoryAreaByPtr(
537 PMMSUPPORT AddressSpace
,
539 PMM_FREE_PAGE_FUNC FreePage
,
540 PVOID FreePageContext
545 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
549 MmLocateMemoryAreaByRegion(
550 PMMSUPPORT AddressSpace
,
558 PMMSUPPORT AddressSpace
,
560 ULONG_PTR Granularity
,
566 MmReleaseMemoryAreaIfDecommitted(
567 struct _EPROCESS
*Process
,
568 PMMSUPPORT AddressSpace
,
574 MmMapMemoryArea(PVOID BaseAddress
,
579 /* npool.c *******************************************************************/
583 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
587 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
591 MiInitializeNonPagedPool(VOID
);
596 IN POOL_TYPE PoolType
,
597 IN SIZE_T SizeInBytes
603 IN PVOID VirtualAddress
609 IN PVOID StartingAddress
619 /* pool.c *******************************************************************/
623 ExAllocateNonPagedPoolWithTag(
632 ExAllocatePagedPoolWithTag(
640 ExFreeNonPagedPool(PVOID block
);
644 ExFreePagedPool(IN PVOID Block
);
648 ExpIsPoolTagDebuggable(ULONG Tag
);
652 ExpAllocateDebugPool(
662 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
666 MmInitializePagedPool(VOID
);
670 MiAllocateSpecialPool(
671 IN POOL_TYPE PoolType
,
672 IN SIZE_T NumberOfBytes
,
680 IN POOL_TYPE PoolType
,
681 IN ULONG CurrentMaxQuota
,
682 OUT PULONG NewMaxQuota
685 /* mdl.c *********************************************************************/
694 /* mminit.c ******************************************************************/
698 MiShutdownMemoryManager(VOID
);
708 MmInitSystem(IN ULONG Phase
,
709 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
713 MiFreeInitMemory(VOID
);
717 MmInitializeMdlImplementation(VOID
);
719 /* pagefile.c ****************************************************************/
723 MmAllocSwapPage(VOID
);
727 MmDereserveSwapPages(ULONG Nr
);
731 MmFreeSwapPage(SWAPENTRY Entry
);
735 MmInitPagingFile(VOID
);
746 MmReserveSwapPages(ULONG Nr
);
759 ULONG BugCodeParameter1
,
760 ULONG BugCodeParameter2
,
761 ULONG BugCodeParameter3
,
762 ULONG BugCodeParameter4
,
763 struct _KTRAP_FRAME
* TrapFrame
768 MmIsAvailableSwapPage(VOID
);
772 MmShowOutOfSpaceMessagePagingFile(VOID
);
774 /* process.c ****************************************************************/
778 MmInitializeProcessAddressSpace(
779 IN PEPROCESS Process
,
780 IN PEPROCESS Clone OPTIONAL
,
781 IN PVOID Section OPTIONAL
,
783 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
789 IN PEPROCESS Process
,
790 IN PINITIAL_PEB InitialPeb
,
797 IN PEPROCESS Process
,
798 IN PCLIENT_ID ClientId
,
799 IN PINITIAL_TEB InitialTeb
,
806 struct _EPROCESS
*Process
,
812 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
816 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
820 MmGetSessionLocaleId(VOID
);
824 MmSetMemoryPriorityProcess(
825 IN PEPROCESS Process
,
826 IN UCHAR MemoryPriority
829 /* i386/pfault.c *************************************************************/
841 /* mm.c **********************************************************************/
846 IN BOOLEAN StoreInstruction
,
848 IN KPROCESSOR_MODE Mode
,
849 IN PVOID TrapInformation
852 /* anonmem.c *****************************************************************/
856 MmNotPresentFaultVirtualMemory(
857 PMMSUPPORT AddressSpace
,
858 MEMORY_AREA
* MemoryArea
,
865 MmPageOutVirtualMemory(
866 PMMSUPPORT AddressSpace
,
867 PMEMORY_AREA MemoryArea
,
869 struct _MM_PAGEOP
* PageOp
875 PMEMORY_AREA MemoryArea
,
877 PMEMORY_BASIC_INFORMATION Info
,
884 struct _EPROCESS
* Process
,
885 PMEMORY_AREA MemoryArea
891 PMMSUPPORT AddressSpace
,
892 PMEMORY_AREA MemoryArea
,
901 MmWritePageVirtualMemory(
902 PMMSUPPORT AddressSpace
,
908 /* kmap.c ********************************************************************/
912 ExAllocatePage(VOID
);
916 ExUnmapPage(PVOID Addr
);
920 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
931 MiZeroPage(PFN_TYPE Page
);
933 /* memsafe.s *****************************************************************/
937 MmSafeReadPtr(PVOID Source
);
939 /* pageop.c ******************************************************************/
943 MmReleasePageOp(PMM_PAGEOP PageOp
);
951 PMM_SECTION_SEGMENT Segment
,
963 PMM_SECTION_SEGMENT Segment
,
969 MmInitializePageOp(VOID
);
971 /* process.c *****************************************************************/
975 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
979 MmDeleteKernelStack(PVOID Stack
,
982 /* balace.c ******************************************************************/
986 MmInitializeMemoryConsumer(
988 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
993 MmInitializeBalancer(
994 ULONG NrAvailablePages
,
1000 MmReleasePageMemoryConsumer(
1007 MmRequestPageMemoryConsumer(
1010 PPFN_TYPE AllocatedPage
1015 MiInitBalancerThread(VOID
);
1019 MmRebalanceMemoryConsumers(VOID
);
1021 /* rmap.c **************************************************************/
1025 MmSetRmapListHeadPage(
1027 struct _MM_RMAP_ENTRY
* ListHead
1030 struct _MM_RMAP_ENTRY
*
1032 MmGetRmapListHeadPage(PFN_TYPE Page
);
1038 struct _EPROCESS
*Process
,
1047 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
1054 struct _EPROCESS
*Process
,
1060 MmInitializeRmapList(VOID
);
1064 MmSetCleanAllRmaps(PFN_TYPE Page
);
1068 MmSetDirtyAllRmaps(PFN_TYPE Page
);
1072 MmIsDirtyPageRmap(PFN_TYPE Page
);
1076 MmWritePagePhysicalAddress(PFN_TYPE Page
);
1080 MmPageOutPhysicalAddress(PFN_TYPE Page
);
1082 /* freelist.c **********************************************************/
1086 MiGetPfnEntry(IN PFN_TYPE Pfn
)
1089 extern RTL_BITMAP MiPfnBitMap
;
1091 /* Make sure the PFN number is valid */
1092 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
1094 /* Make sure this page actually has a PFN entry */
1095 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, Pfn
))) return NULL
;
1098 Page
= &MmPfnDatabase
[0][Pfn
];
1106 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
1109 // This will return the Page Frame Number (PFN) from the MMPFN
1111 return Pfn1
- MmPfnDatabase
[0];
1116 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
1120 MmGetLRUFirstUserPage(VOID
);
1124 MmInsertLRULastUserPage(PFN_TYPE Page
);
1128 MmRemoveLRUUserPage(PFN_TYPE Page
);
1132 MmLockPage(PFN_TYPE Page
);
1136 MmUnlockPage(PFN_TYPE Page
);
1140 MmGetLockCountPage(PFN_TYPE Page
);
1144 MmInitializePageList(
1156 MmGetContinuousPages(
1157 ULONG NumberOfBytes
,
1158 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1159 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1160 PHYSICAL_ADDRESS BoundaryAddressMultiple
,
1166 MmZeroPageThreadMain(
1170 /* hypermap.c *****************************************************************/
1172 extern PEPROCESS HyperProcess
;
1173 extern KIRQL HyperIrql
;
1177 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1183 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1189 MiMapPagesToZeroInHyperSpace(IN PMMPFN
*Pages
,
1190 IN PFN_NUMBER NumberOfPages
);
1194 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1195 IN PFN_NUMBER NumberOfPages
);
1198 // ReactOS Compatibility Layer
1202 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1204 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1205 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1210 MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page
)
1212 PMMPFN Pfn1
= MiGetPfnEntry(Page
);
1213 return MiMapPagesToZeroInHyperSpace(&Pfn1
, 1);
1216 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1218 /* i386/page.c *********************************************************/
1222 MmCreateVirtualMappingForKernel(
1231 MmCommitPagedPoolAddress(
1238 MmCreateVirtualMapping(
1239 struct _EPROCESS
* Process
,
1248 MmCreateVirtualMappingUnsafe(
1249 struct _EPROCESS
* Process
,
1259 struct _EPROCESS
* Process
,
1265 struct _EPROCESS
* Process
,
1273 struct _EPROCESS
* Process
,
1279 MmInitGlobalKernelPageDirectory(VOID
);
1283 MmDisableVirtualMapping(
1284 struct _EPROCESS
*Process
,
1292 MmEnableVirtualMapping(
1293 struct _EPROCESS
*Process
,
1299 MmRawDeleteVirtualMapping(PVOID Address
);
1303 MmDeletePageFileMapping(
1304 struct _EPROCESS
*Process
,
1306 SWAPENTRY
* SwapEntry
1311 MmCreatePageFileMapping(
1312 struct _EPROCESS
*Process
,
1320 struct _EPROCESS
*Process
,
1326 MmTransferOwnershipPage(
1334 struct _EPROCESS
*Process
,
1346 MmAllocPagesSpecifyRange(
1348 PHYSICAL_ADDRESS LowestAddress
,
1349 PHYSICAL_ADDRESS HighestAddress
,
1350 ULONG NumberOfPages
,
1356 MmDereferencePage(PFN_TYPE Page
);
1360 MmReferencePage(PFN_TYPE Page
);
1364 MmGetReferenceCountPage(PFN_TYPE Page
);
1368 MmIsPageInUse(PFN_TYPE Page
);
1372 MmSetSavedSwapEntryPage(
1374 SWAPENTRY SavedSwapEntry
);
1378 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1383 struct _EPROCESS
*Process
,
1389 MmCreatePageTable(PVOID PAddress
);
1394 struct _EPROCESS
*Process
,
1401 struct _EPROCESS
*Process
,
1407 MmCreateProcessAddressSpace(
1410 IN PULONG DirectoryTableBase
1415 MmInitializeHandBuiltProcess(
1416 IN PEPROCESS Process
,
1417 IN PULONG DirectoryTableBase
1423 MmInitializeHandBuiltProcess2(
1424 IN PEPROCESS Process
1429 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1433 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1437 MmDeleteVirtualMapping(
1438 struct _EPROCESS
*Process
,
1448 struct _EPROCESS
*Process
,
1454 MmMarkPageMapped(PFN_TYPE Page
);
1458 MmMarkPageUnmapped(PFN_TYPE Page
);
1463 struct _EPROCESS
*Process
,
1470 MiInitPageDirectoryMap(VOID
);
1474 MiGetUserPageDirectoryCount(VOID
);
1476 /* wset.c ********************************************************************/
1485 /* region.c ************************************************************/
1490 PMMSUPPORT AddressSpace
,
1492 PLIST_ENTRY RegionListHead
,
1497 PMM_ALTER_REGION_FUNC AlterFunc
1503 PLIST_ENTRY RegionListHead
,
1513 PLIST_ENTRY RegionListHead
,
1515 PVOID
* RegionBaseAddress
1518 /* section.c *****************************************************************/
1522 MmGetFileObjectForSection(
1523 IN PROS_SECTION_OBJECT Section
1527 MmGetFileNameForAddress(
1529 OUT PUNICODE_STRING ModuleName
1534 MmGetFileNameForSection(
1535 IN PROS_SECTION_OBJECT Section
,
1536 OUT POBJECT_NAME_INFORMATION
*ModuleName
1549 PMEMORY_AREA MemoryArea
,
1551 PMEMORY_BASIC_INFORMATION Info
,
1557 MmProtectSectionView(
1558 PMMSUPPORT AddressSpace
,
1559 PMEMORY_AREA MemoryArea
,
1568 MmWritePageSectionView(
1569 PMMSUPPORT AddressSpace
,
1577 MmInitSectionImplementation(VOID
);
1581 MmNotPresentFaultSectionView(
1582 PMMSUPPORT AddressSpace
,
1583 MEMORY_AREA
* MemoryArea
,
1590 MmPageOutSectionView(
1591 PMMSUPPORT AddressSpace
,
1592 PMEMORY_AREA MemoryArea
,
1594 struct _MM_PAGEOP
*PageOp
1599 MmCreatePhysicalMemorySection(VOID
);
1603 MmAccessFaultSectionView(
1604 PMMSUPPORT AddressSpace
,
1605 MEMORY_AREA
* MemoryArea
,
1612 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1614 /* mpw.c *********************************************************************/
1618 MmInitMpwThread(VOID
);
1622 MmInitBsmThread(VOID
);
1624 /* pager.c *******************************************************************/
1628 MiIsPagerThread(VOID
);
1632 MiStartPagerThread(VOID
);
1636 MiStopPagerThread(VOID
);
1640 MiQueryVirtualMemory(
1641 IN HANDLE ProcessHandle
,
1643 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1644 OUT PVOID VirtualMemoryInformation
,
1646 OUT PULONG ResultLength
1649 /* sysldr.c ******************************************************************/
1653 MiReloadBootLoadedDrivers(
1654 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1659 MiInitializeLoadedModuleList(
1660 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1666 IN PUNICODE_STRING FileName
,
1667 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1668 IN PUNICODE_STRING LoadedName OPTIONAL
,
1670 OUT PVOID
*ModuleObject
,
1671 OUT PVOID
*ImageBaseAddress
1676 MmUnloadSystemImage(
1677 IN PVOID ImageHandle
1683 IN HANDLE ImageHandle
,
1684 IN BOOLEAN PurgeSection
1689 MmCallDllInitialize(
1690 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1691 IN PLIST_ENTRY ListHead
1694 /* ReactOS Mm Hacks */
1697 MiSyncForProcessAttach(
1698 IN PKTHREAD NextThread
,
1699 IN PEPROCESS Process
1704 MiSyncForContextSwitch(
1708 extern PMMSUPPORT MmKernelAddressSpace
;
1712 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1714 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1719 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1721 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1726 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1728 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1729 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1734 MmGetCurrentAddressSpace(VOID
)
1736 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1741 MmGetKernelAddressSpace(VOID
)
1743 return MmKernelAddressSpace
;