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
;
18 extern PVOID MmPagedPoolBase
;
19 extern ULONG MmPagedPoolSize
;
21 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
22 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
23 extern ULONG MmHighestPhysicalPage
;
24 extern PVOID MmPfnDatabase
;
28 struct _MM_RMAP_ENTRY
;
30 typedef ULONG SWAPENTRY
;
31 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
33 #define MEMORY_AREA_INVALID (0)
34 #define MEMORY_AREA_SECTION_VIEW (1)
35 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
36 #define MEMORY_AREA_NO_CACHE (3)
37 #define MEMORY_AREA_IO_MAPPING (4)
38 #define MEMORY_AREA_SYSTEM (5)
39 #define MEMORY_AREA_MDL_MAPPING (7)
40 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
41 #define MEMORY_AREA_CACHE_SEGMENT (9)
42 #define MEMORY_AREA_SHARED_DATA (10)
43 #define MEMORY_AREA_KERNEL_STACK (11)
44 #define MEMORY_AREA_PAGED_POOL (12)
45 #define MEMORY_AREA_NO_ACCESS (13)
46 #define MEMORY_AREA_PEB_OR_TEB (14)
48 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
50 #define MM_CORE_DUMP_TYPE_NONE (0x0)
51 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
52 #define MM_CORE_DUMP_TYPE_FULL (0x2)
54 #define MM_PAGEOP_PAGEIN (1)
55 #define MM_PAGEOP_PAGEOUT (2)
56 #define MM_PAGEOP_PAGESYNCH (3)
57 #define MM_PAGEOP_ACCESSFAULT (4)
59 /* Number of list heads to use */
60 #define MI_FREE_POOL_LISTS 4
62 #define HYPER_SPACE (0xC0400000)
64 #define MI_HYPERSPACE_PTES (256 - 1)
65 #define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE
66 #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
67 MI_HYPERSPACE_PTES * PAGE_SIZE)
69 /* Signature of free pool blocks */
70 #define MM_FREE_POOL_TAG TAG('F', 'r', 'p', 'l')
72 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
75 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
76 ((((x)) % (4*1024*1024)) / (4*1024))
78 #define NR_SECTION_PAGE_TABLES 1024
79 #define NR_SECTION_PAGE_ENTRIES 1024
81 #define TEB_BASE 0x7FFDE000
83 /* Although Microsoft says this isn't hardcoded anymore,
84 they won't be able to change it. Stuff depends on it */
85 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
87 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
90 * Additional flags for protection attributes
92 #define PAGE_WRITETHROUGH (1024)
93 #define PAGE_SYSTEM (2048)
95 #define SEC_PHYSICALMEMORY (0x80000000)
97 #define MM_PAGEFILE_SEGMENT (0x1)
98 #define MM_DATAFILE_SEGMENT (0x2)
103 #define MC_NPPOOL (3)
104 #define MC_MAXIMUM (4)
106 #define PAGED_POOL_MASK 1
107 #define MUST_SUCCEED_POOL_MASK 2
108 #define CACHE_ALIGNED_POOL_MASK 4
109 #define QUOTA_POOL_MASK 8
110 #define SESSION_POOL_MASK 32
111 #define VERIFIER_POOL_MASK 64
113 #define MM_PAGED_POOL_SIZE (100*1024*1024)
114 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
117 * Paged and non-paged pools are 8-byte aligned
119 #define MM_POOL_ALIGNMENT 8
122 * Maximum size of the kmalloc area (this is totally arbitary)
124 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
125 #define MM_KERNEL_MAP_BASE (0xf0c00000)
128 * FIXME - different architectures have different cache line sizes...
130 #define MM_CACHE_LINE_SIZE 32
132 #define MM_ROUND_UP(x,s) \
133 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
135 #define MM_ROUND_DOWN(x,s) \
136 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
138 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
143 PAGE_EXECUTE_READ | \
144 PAGE_EXECUTE_READWRITE | \
145 PAGE_EXECUTE_WRITECOPY | \
150 #define PAGE_FLAGS_VALID_FOR_SECTION \
155 PAGE_EXECUTE_READ | \
156 PAGE_EXECUTE_READWRITE | \
157 PAGE_EXECUTE_WRITECOPY | \
160 #define PAGE_IS_READABLE \
164 PAGE_EXECUTE_READ | \
165 PAGE_EXECUTE_READWRITE | \
166 PAGE_EXECUTE_WRITECOPY)
168 #define PAGE_IS_WRITABLE \
171 PAGE_EXECUTE_READWRITE | \
172 PAGE_EXECUTE_WRITECOPY)
174 #define PAGE_IS_EXECUTABLE \
176 PAGE_EXECUTE_READ | \
177 PAGE_EXECUTE_READWRITE | \
178 PAGE_EXECUTE_WRITECOPY)
180 #define PAGE_IS_WRITECOPY \
182 PAGE_EXECUTE_WRITECOPY)
185 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
186 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
188 #define InterlockedExchangePte(PointerPte, Value) \
189 InterlockedExchange((PLONG)(PointerPte), Value)
193 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
194 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
198 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
199 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
201 typedef struct _MM_SECTION_SEGMENT
203 LONG FileOffset
; /* start offset into the file for image sections */
204 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
205 ULONG RawLength
; /* length of the segment which is part of the mapped file */
206 ULONG Length
; /* absolute length of the segment */
208 FAST_MUTEX Lock
; /* lock which protects the page directory */
209 ULONG ReferenceCount
;
210 SECTION_PAGE_DIRECTORY PageDirectory
;
212 ULONG Characteristics
;
214 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
216 typedef struct _MM_IMAGE_SECTION_OBJECT
219 ULONG_PTR StackReserve
;
220 ULONG_PTR StackCommit
;
221 ULONG_PTR EntryPoint
;
223 USHORT ImageCharacteristics
;
224 USHORT MinorSubsystemVersion
;
225 USHORT MajorSubsystemVersion
;
230 PMM_SECTION_SEGMENT Segments
;
231 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
233 typedef struct _ROS_SECTION_OBJECT
237 LARGE_INTEGER MaximumSize
;
238 ULONG SectionPageProtection
;
239 ULONG AllocationAttributes
;
240 PFILE_OBJECT FileObject
;
243 PMM_IMAGE_SECTION_OBJECT ImageSection
;
244 PMM_SECTION_SEGMENT Segment
;
246 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
248 typedef struct _MEMORY_AREA
250 PVOID StartingAddress
;
252 struct _MEMORY_AREA
*Parent
;
253 struct _MEMORY_AREA
*LeftChild
;
254 struct _MEMORY_AREA
*RightChild
;
258 BOOLEAN DeleteInProgress
;
264 ROS_SECTION_OBJECT
* Section
;
266 PMM_SECTION_SEGMENT Segment
;
267 BOOLEAN WriteCopyView
;
268 LIST_ENTRY RegionListHead
;
272 LIST_ENTRY RegionListHead
;
275 } MEMORY_AREA
, *PMEMORY_AREA
;
285 ULONG PagingRequestsInLastMinute
;
286 ULONG PagingRequestsInLastFiveMinutes
;
287 ULONG PagingRequestsInLastFifteenMinutes
;
290 typedef struct _PHYSICAL_PAGE
299 ULONG StartOfAllocation
: 1;
300 ULONG EndOfAllocation
: 1;
306 LIST_ENTRY ListEntry
;
307 ULONG ReferenceCount
;
308 SWAPENTRY SavedSwapEntry
;
311 struct _MM_RMAP_ENTRY
* RmapListHead
;
313 PHYSICAL_PAGE
, *PPHYSICAL_PAGE
;
315 extern MM_STATS MmStats
;
317 typedef struct _MM_PAGEOP
319 /* Type of operation. */
321 /* Number of threads interested in this operation. */
322 ULONG ReferenceCount
;
323 /* Event that will be set when the operation is completed. */
324 KEVENT CompletionEvent
;
325 /* Status of the operation once it is completed. */
327 /* TRUE if the operation was abandoned. */
329 /* The memory area to be affected by the operation. */
332 struct _MM_PAGEOP
* Next
;
333 struct _ETHREAD
* Thread
;
335 * These fields are used to identify the operation if it is against a
336 * virtual memory area.
341 * These fields are used to identify the operation if it is against a
344 PMM_SECTION_SEGMENT Segment
;
346 } MM_PAGEOP
, *PMM_PAGEOP
;
348 typedef struct _MM_MEMORY_CONSUMER
352 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
353 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
355 typedef struct _MM_REGION
360 LIST_ENTRY RegionListEntry
;
361 } MM_REGION
, *PMM_REGION
;
363 /* Entry describing free pool memory */
364 typedef struct _MMFREE_POOL_ENTRY
369 struct _MMFREE_POOL_ENTRY
*Owner
;
370 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
372 /* Paged pool information */
373 typedef struct _MM_PAGED_POOL_INFO
375 PRTL_BITMAP PagedPoolAllocationMap
;
376 PRTL_BITMAP EndOfPagedPoolBitmap
;
377 PMMPTE FirstPteForPagedPool
;
378 PMMPTE LastPteForPagedPool
;
379 PMMPTE NextPdeForPagedPoolExpansion
;
381 SIZE_T PagedPoolCommit
;
382 SIZE_T AllocatedPagedPool
;
383 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
385 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
388 (*PMM_ALTER_REGION_FUNC
)(
389 PMM_AVL_TABLE AddressSpace
,
399 (*PMM_FREE_PAGE_FUNC
)(
401 PMEMORY_AREA MemoryArea
,
408 /* marea.c *******************************************************************/
413 PMM_AVL_TABLE AddressSpace
,
418 PMEMORY_AREA
*Result
,
419 BOOLEAN FixedAddress
,
420 ULONG AllocationFlags
,
421 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
426 MmLocateMemoryAreaByAddress(
427 PMM_AVL_TABLE AddressSpace
,
434 PMM_AVL_TABLE AddressSpace
,
441 PMM_AVL_TABLE AddressSpace
,
442 PMEMORY_AREA MemoryArea
,
443 PMM_FREE_PAGE_FUNC FreePage
,
444 PVOID FreePageContext
449 MmFreeMemoryAreaByPtr(
450 PMM_AVL_TABLE AddressSpace
,
452 PMM_FREE_PAGE_FUNC FreePage
,
453 PVOID FreePageContext
458 MmDumpMemoryAreas(PMM_AVL_TABLE AddressSpace
);
462 MmLocateMemoryAreaByRegion(
463 PMM_AVL_TABLE AddressSpace
,
471 PMM_AVL_TABLE AddressSpace
,
473 ULONG_PTR Granularity
,
479 MmReleaseMemoryAreaIfDecommitted(
480 struct _EPROCESS
*Process
,
481 PMM_AVL_TABLE AddressSpace
,
487 MmMapMemoryArea(PVOID BaseAddress
,
492 /* npool.c *******************************************************************/
496 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
500 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
504 MiInitializeNonPagedPool(VOID
);
509 IN POOL_TYPE PoolType
,
510 IN SIZE_T SizeInBytes
516 IN PVOID VirtualAddress
522 IN PVOID StartingAddress
532 /* pool.c *******************************************************************/
536 ExAllocateNonPagedPoolWithTag(
545 ExAllocatePagedPoolWithTag(
553 ExFreeNonPagedPool(PVOID block
);
557 ExFreePagedPool(IN PVOID Block
);
561 MmInitializePagedPool(VOID
);
565 MiAllocateSpecialPool(
566 IN POOL_TYPE PoolType
,
567 IN SIZE_T NumberOfBytes
,
575 IN POOL_TYPE PoolType
,
576 IN ULONG CurrentMaxQuota
,
577 OUT PULONG NewMaxQuota
580 /* mdl.c *********************************************************************/
589 /* mminit.c ******************************************************************/
593 MiShutdownMemoryManager(VOID
);
603 MmInitSystem(IN ULONG Phase
,
604 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
608 MiFreeInitMemory(VOID
);
612 MmInitializeMdlImplementation(VOID
);
614 /* pagefile.c ****************************************************************/
618 MmAllocSwapPage(VOID
);
622 MmDereserveSwapPages(ULONG Nr
);
626 MmFreeSwapPage(SWAPENTRY Entry
);
630 MmInitPagingFile(VOID
);
641 MmReserveSwapPages(ULONG Nr
);
654 ULONG BugCodeParameter1
,
655 ULONG BugCodeParameter2
,
656 ULONG BugCodeParameter3
,
657 ULONG BugCodeParameter4
,
658 struct _KTRAP_FRAME
* TrapFrame
663 MmIsAvailableSwapPage(VOID
);
667 MmShowOutOfSpaceMessagePagingFile(VOID
);
669 /* process.c ****************************************************************/
673 MmInitializeProcessAddressSpace(
674 IN PEPROCESS Process
,
675 IN PEPROCESS Clone OPTIONAL
,
676 IN PVOID Section OPTIONAL
,
678 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
683 MmCreatePeb(struct _EPROCESS
*Process
);
688 struct _EPROCESS
*Process
,
690 PINITIAL_TEB InitialTeb
696 struct _EPROCESS
*Process
,
702 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
706 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
710 MmGetSessionLocaleId(VOID
);
714 MmSetMemoryPriorityProcess(
715 IN PEPROCESS Process
,
716 IN UCHAR MemoryPriority
719 /* i386/pfault.c *************************************************************/
731 /* mm.c **********************************************************************/
736 IN BOOLEAN StoreInstruction
,
738 IN KPROCESSOR_MODE Mode
,
739 IN PVOID TrapInformation
742 /* anonmem.c *****************************************************************/
746 MmNotPresentFaultVirtualMemory(
747 PMM_AVL_TABLE AddressSpace
,
748 MEMORY_AREA
* MemoryArea
,
755 MmPageOutVirtualMemory(
756 PMM_AVL_TABLE AddressSpace
,
757 PMEMORY_AREA MemoryArea
,
759 struct _MM_PAGEOP
* PageOp
765 PMEMORY_AREA MemoryArea
,
767 PMEMORY_BASIC_INFORMATION Info
,
774 struct _EPROCESS
* Process
,
775 PMEMORY_AREA MemoryArea
781 PMM_AVL_TABLE AddressSpace
,
782 PMEMORY_AREA MemoryArea
,
791 MmWritePageVirtualMemory(
792 PMM_AVL_TABLE AddressSpace
,
798 /* kmap.c ********************************************************************/
802 ExAllocatePage(VOID
);
806 ExUnmapPage(PVOID Addr
);
810 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
821 MiZeroPage(PFN_TYPE Page
);
823 /* memsafe.s *****************************************************************/
827 MmSafeReadPtr(PVOID Source
);
829 /* pageop.c ******************************************************************/
833 MmReleasePageOp(PMM_PAGEOP PageOp
);
841 PMM_SECTION_SEGMENT Segment
,
853 PMM_SECTION_SEGMENT Segment
,
859 MmInitializePageOp(VOID
);
861 /* process.c *****************************************************************/
865 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
869 MmDeleteKernelStack(PVOID Stack
,
872 /* balace.c ******************************************************************/
876 MmInitializeMemoryConsumer(
878 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
883 MmInitializeBalancer(
884 ULONG NrAvailablePages
,
890 MmReleasePageMemoryConsumer(
897 MmRequestPageMemoryConsumer(
900 PPFN_TYPE AllocatedPage
905 MiInitBalancerThread(VOID
);
909 MmRebalanceMemoryConsumers(VOID
);
911 /* rmap.c **************************************************************/
915 MmSetRmapListHeadPage(
917 struct _MM_RMAP_ENTRY
* ListHead
920 struct _MM_RMAP_ENTRY
*
922 MmGetRmapListHeadPage(PFN_TYPE Page
);
928 struct _EPROCESS
*Process
,
937 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
944 struct _EPROCESS
*Process
,
950 MmInitializeRmapList(VOID
);
954 MmSetCleanAllRmaps(PFN_TYPE Page
);
958 MmSetDirtyAllRmaps(PFN_TYPE Page
);
962 MmIsDirtyPageRmap(PFN_TYPE Page
);
966 MmWritePagePhysicalAddress(PFN_TYPE Page
);
970 MmPageOutPhysicalAddress(PFN_TYPE Page
);
972 /* freelist.c **********************************************************/
974 #define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
978 MiGetPfnEntry(IN PFN_TYPE Pfn
)
981 extern PPHYSICAL_PAGE MmPageArray
;
982 extern ULONG MmPageArraySize
;
984 /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
985 UNREFERENCED_PARAMETER(MmPageArraySize
);
987 /* Make sure the PFN number is valid */
988 ASSERT(Pfn
<= MmPageArraySize
);
991 Page
= &MmPageArray
[Pfn
];
993 /* Make sure it's valid */
1002 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
1006 MmGetLRUFirstUserPage(VOID
);
1010 MmInsertLRULastUserPage(PFN_TYPE Page
);
1014 MmRemoveLRUUserPage(PFN_TYPE Page
);
1018 MmLockPage(PFN_TYPE Page
);
1022 MmLockPageUnsafe(PFN_TYPE Page
);
1026 MmUnlockPage(PFN_TYPE Page
);
1030 MmGetLockCountPage(PFN_TYPE Page
);
1036 MmAcquirePageListLock()
1038 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
1044 MmReleasePageListLock(KIRQL oldIrql
)
1046 KeReleaseQueuedSpinLock(LockQueuePfnLock
, oldIrql
);
1051 MmInitializePageList(
1057 MmGetContinuousPages(
1058 ULONG NumberOfBytes
,
1059 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1060 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1061 PHYSICAL_ADDRESS BoundaryAddressMultiple
1066 MmZeroPageThreadMain(
1070 /* hypermap.c *****************************************************************/
1072 extern PEPROCESS HyperProcess
;
1073 extern KIRQL HyperIrql
;
1077 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1083 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1089 MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER Page
);
1093 MiUnmapPagesInZeroSpace(IN PVOID Address
);
1096 // ReactOS Compatibility Layer
1100 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1102 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1103 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1106 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1108 /* i386/page.c *********************************************************/
1112 MmCreateVirtualMappingForKernel(
1121 MmCommitPagedPoolAddress(
1128 MmCreateVirtualMapping(
1129 struct _EPROCESS
* Process
,
1138 MmCreateVirtualMappingUnsafe(
1139 struct _EPROCESS
* Process
,
1149 struct _EPROCESS
* Process
,
1155 struct _EPROCESS
* Process
,
1163 struct _EPROCESS
* Process
,
1169 MmInitGlobalKernelPageDirectory(VOID
);
1173 MmDisableVirtualMapping(
1174 struct _EPROCESS
*Process
,
1182 MmEnableVirtualMapping(
1183 struct _EPROCESS
*Process
,
1189 MmRawDeleteVirtualMapping(PVOID Address
);
1193 MmDeletePageFileMapping(
1194 struct _EPROCESS
*Process
,
1196 SWAPENTRY
* SwapEntry
1201 MmCreatePageFileMapping(
1202 struct _EPROCESS
*Process
,
1210 struct _EPROCESS
*Process
,
1216 MmTransferOwnershipPage(
1224 struct _EPROCESS
*Process
,
1232 SWAPENTRY SavedSwapEntry
1237 MmAllocPagesSpecifyRange(
1239 PHYSICAL_ADDRESS LowestAddress
,
1240 PHYSICAL_ADDRESS HighestAddress
,
1241 ULONG NumberOfPages
,
1247 MmDereferencePage(PFN_TYPE Page
);
1251 MmReferencePage(PFN_TYPE Page
);
1255 MmReferencePageUnsafe(PFN_TYPE Page
);
1259 MmGetReferenceCountPage(PFN_TYPE Page
);
1263 MmIsPageInUse(PFN_TYPE Page
);
1273 MmGetFlagsPage(PFN_TYPE Page
);
1277 MmSetSavedSwapEntryPage(
1279 SWAPENTRY SavedSwapEntry
);
1283 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1288 struct _EPROCESS
*Process
,
1294 MmCreatePageTable(PVOID PAddress
);
1299 struct _EPROCESS
*Process
,
1306 struct _EPROCESS
*Process
,
1312 MmCreateProcessAddressSpace(
1315 IN PULONG DirectoryTableBase
1320 MmInitializeHandBuiltProcess(
1321 IN PEPROCESS Process
,
1322 IN PULONG DirectoryTableBase
1328 MmInitializeHandBuiltProcess2(
1329 IN PEPROCESS Process
1334 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1338 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1342 MmDeleteVirtualMapping(
1343 struct _EPROCESS
*Process
,
1353 struct _EPROCESS
*Process
,
1359 MmMarkPageMapped(PFN_TYPE Page
);
1363 MmMarkPageUnmapped(PFN_TYPE Page
);
1368 struct _EPROCESS
*Process
,
1375 MiInitPageDirectoryMap(VOID
);
1379 MiGetUserPageDirectoryCount(VOID
);
1381 /* wset.c ********************************************************************/
1390 /* region.c ************************************************************/
1395 PMM_AVL_TABLE AddressSpace
,
1397 PLIST_ENTRY RegionListHead
,
1402 PMM_ALTER_REGION_FUNC AlterFunc
1408 PLIST_ENTRY RegionListHead
,
1418 PLIST_ENTRY RegionListHead
,
1420 PVOID
* RegionBaseAddress
1423 /* section.c *****************************************************************/
1427 MmGetFileObjectForSection(
1428 IN PROS_SECTION_OBJECT Section
1432 MmGetFileNameForAddress(
1434 OUT PUNICODE_STRING ModuleName
1439 MmGetFileNameForSection(
1440 IN PROS_SECTION_OBJECT Section
,
1441 OUT POBJECT_NAME_INFORMATION
*ModuleName
1454 PMEMORY_AREA MemoryArea
,
1456 PMEMORY_BASIC_INFORMATION Info
,
1462 MmProtectSectionView(
1463 PMM_AVL_TABLE AddressSpace
,
1464 PMEMORY_AREA MemoryArea
,
1473 MmWritePageSectionView(
1474 PMM_AVL_TABLE AddressSpace
,
1482 MmInitSectionImplementation(VOID
);
1486 MmNotPresentFaultSectionView(
1487 PMM_AVL_TABLE AddressSpace
,
1488 MEMORY_AREA
* MemoryArea
,
1495 MmPageOutSectionView(
1496 PMM_AVL_TABLE AddressSpace
,
1497 PMEMORY_AREA MemoryArea
,
1499 struct _MM_PAGEOP
*PageOp
1504 MmCreatePhysicalMemorySection(VOID
);
1508 MmAccessFaultSectionView(
1509 PMM_AVL_TABLE AddressSpace
,
1510 MEMORY_AREA
* MemoryArea
,
1517 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1519 /* mpw.c *********************************************************************/
1523 MmInitMpwThread(VOID
);
1527 MmInitBsmThread(VOID
);
1529 /* pager.c *******************************************************************/
1533 MiIsPagerThread(VOID
);
1537 MiStartPagerThread(VOID
);
1541 MiStopPagerThread(VOID
);
1545 MiQueryVirtualMemory(
1546 IN HANDLE ProcessHandle
,
1548 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1549 OUT PVOID VirtualMemoryInformation
,
1551 OUT PULONG ResultLength
1554 /* sysldr.c ******************************************************************/
1558 MiReloadBootLoadedDrivers(
1559 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1564 MiInitializeLoadedModuleList(
1565 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1571 IN PUNICODE_STRING FileName
,
1572 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1573 IN PUNICODE_STRING LoadedName OPTIONAL
,
1575 OUT PVOID
*ModuleObject
,
1576 OUT PVOID
*ImageBaseAddress
1581 MmUnloadSystemImage(
1582 IN PVOID ImageHandle
1588 IN HANDLE ImageHandle
,
1589 IN BOOLEAN PurgeSection
1594 MmCallDllInitialize(
1595 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1596 IN PLIST_ENTRY ListHead
1599 /* ReactOS Mm Hacks */
1602 MiSyncForProcessAttach(
1603 IN PKTHREAD NextThread
,
1604 IN PEPROCESS Process
1609 MiSyncForContextSwitch(
1613 extern PMM_AVL_TABLE MmKernelAddressSpace
;
1617 MmLockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1619 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1624 MmUnlockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1626 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1631 MmGetAddressSpaceOwner(IN PMM_AVL_TABLE AddressSpace
)
1633 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1634 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
);
1639 MmGetCurrentAddressSpace(VOID
)
1641 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->VadRoot
;
1646 MmGetKernelAddressSpace(VOID
)
1648 return MmKernelAddressSpace
;