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)
68 #define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \
71 /* Signature of free pool blocks */
72 #define MM_FREE_POOL_TAG TAG('F', 'r', 'p', 'l')
74 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
77 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
78 ((((x)) % (4*1024*1024)) / (4*1024))
80 #define NR_SECTION_PAGE_TABLES 1024
81 #define NR_SECTION_PAGE_ENTRIES 1024
83 #define TEB_BASE 0x7FFDE000
85 /* Although Microsoft says this isn't hardcoded anymore,
86 they won't be able to change it. Stuff depends on it */
87 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
89 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
92 * Additional flags for protection attributes
94 #define PAGE_WRITETHROUGH (1024)
95 #define PAGE_SYSTEM (2048)
97 #define SEC_PHYSICALMEMORY (0x80000000)
99 #define MM_PAGEFILE_SEGMENT (0x1)
100 #define MM_DATAFILE_SEGMENT (0x2)
105 #define MC_NPPOOL (3)
106 #define MC_MAXIMUM (4)
108 #define PAGED_POOL_MASK 1
109 #define MUST_SUCCEED_POOL_MASK 2
110 #define CACHE_ALIGNED_POOL_MASK 4
111 #define QUOTA_POOL_MASK 8
112 #define SESSION_POOL_MASK 32
113 #define VERIFIER_POOL_MASK 64
115 #define MM_PAGED_POOL_SIZE (100*1024*1024)
116 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
119 * Paged and non-paged pools are 8-byte aligned
121 #define MM_POOL_ALIGNMENT 8
124 * Maximum size of the kmalloc area (this is totally arbitary)
126 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
127 #define MM_KERNEL_MAP_BASE (0xf0c00000)
130 * FIXME - different architectures have different cache line sizes...
132 #define MM_CACHE_LINE_SIZE 32
134 #define MM_ROUND_UP(x,s) \
135 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
137 #define MM_ROUND_DOWN(x,s) \
138 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
140 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
145 PAGE_EXECUTE_READ | \
146 PAGE_EXECUTE_READWRITE | \
147 PAGE_EXECUTE_WRITECOPY | \
152 #define PAGE_FLAGS_VALID_FOR_SECTION \
157 PAGE_EXECUTE_READ | \
158 PAGE_EXECUTE_READWRITE | \
159 PAGE_EXECUTE_WRITECOPY | \
162 #define PAGE_IS_READABLE \
166 PAGE_EXECUTE_READ | \
167 PAGE_EXECUTE_READWRITE | \
168 PAGE_EXECUTE_WRITECOPY)
170 #define PAGE_IS_WRITABLE \
173 PAGE_EXECUTE_READWRITE | \
174 PAGE_EXECUTE_WRITECOPY)
176 #define PAGE_IS_EXECUTABLE \
178 PAGE_EXECUTE_READ | \
179 PAGE_EXECUTE_READWRITE | \
180 PAGE_EXECUTE_WRITECOPY)
182 #define PAGE_IS_WRITECOPY \
184 PAGE_EXECUTE_WRITECOPY)
187 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
188 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
190 #define InterlockedExchangePte(PointerPte, Value) \
191 InterlockedExchange((PLONG)(PointerPte), Value)
195 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
196 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
200 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
201 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
203 typedef struct _MM_SECTION_SEGMENT
205 LONG FileOffset
; /* start offset into the file for image sections */
206 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
207 ULONG RawLength
; /* length of the segment which is part of the mapped file */
208 ULONG Length
; /* absolute length of the segment */
210 FAST_MUTEX Lock
; /* lock which protects the page directory */
211 ULONG ReferenceCount
;
212 SECTION_PAGE_DIRECTORY PageDirectory
;
214 ULONG Characteristics
;
216 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
218 typedef struct _MM_IMAGE_SECTION_OBJECT
221 ULONG_PTR StackReserve
;
222 ULONG_PTR StackCommit
;
223 ULONG_PTR EntryPoint
;
225 USHORT ImageCharacteristics
;
226 USHORT MinorSubsystemVersion
;
227 USHORT MajorSubsystemVersion
;
232 PMM_SECTION_SEGMENT Segments
;
233 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
235 typedef struct _ROS_SECTION_OBJECT
239 LARGE_INTEGER MaximumSize
;
240 ULONG SectionPageProtection
;
241 ULONG AllocationAttributes
;
242 PFILE_OBJECT FileObject
;
245 PMM_IMAGE_SECTION_OBJECT ImageSection
;
246 PMM_SECTION_SEGMENT Segment
;
248 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
250 typedef struct _MEMORY_AREA
252 PVOID StartingAddress
;
254 struct _MEMORY_AREA
*Parent
;
255 struct _MEMORY_AREA
*LeftChild
;
256 struct _MEMORY_AREA
*RightChild
;
260 BOOLEAN DeleteInProgress
;
266 ROS_SECTION_OBJECT
* Section
;
268 PMM_SECTION_SEGMENT Segment
;
269 BOOLEAN WriteCopyView
;
270 LIST_ENTRY RegionListHead
;
274 LIST_ENTRY RegionListHead
;
277 } MEMORY_AREA
, *PMEMORY_AREA
;
287 ULONG PagingRequestsInLastMinute
;
288 ULONG PagingRequestsInLastFiveMinutes
;
289 ULONG PagingRequestsInLastFifteenMinutes
;
292 typedef struct _PHYSICAL_PAGE
301 ULONG StartOfAllocation
: 1;
302 ULONG EndOfAllocation
: 1;
308 LIST_ENTRY ListEntry
;
309 ULONG ReferenceCount
;
310 SWAPENTRY SavedSwapEntry
;
313 struct _MM_RMAP_ENTRY
* RmapListHead
;
315 PHYSICAL_PAGE
, *PPHYSICAL_PAGE
;
317 extern MM_STATS MmStats
;
319 typedef struct _MM_PAGEOP
321 /* Type of operation. */
323 /* Number of threads interested in this operation. */
324 ULONG ReferenceCount
;
325 /* Event that will be set when the operation is completed. */
326 KEVENT CompletionEvent
;
327 /* Status of the operation once it is completed. */
329 /* TRUE if the operation was abandoned. */
331 /* The memory area to be affected by the operation. */
334 struct _MM_PAGEOP
* Next
;
335 struct _ETHREAD
* Thread
;
337 * These fields are used to identify the operation if it is against a
338 * virtual memory area.
343 * These fields are used to identify the operation if it is against a
346 PMM_SECTION_SEGMENT Segment
;
348 } MM_PAGEOP
, *PMM_PAGEOP
;
350 typedef struct _MM_MEMORY_CONSUMER
354 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
355 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
357 typedef struct _MM_REGION
362 LIST_ENTRY RegionListEntry
;
363 } MM_REGION
, *PMM_REGION
;
365 /* Entry describing free pool memory */
366 typedef struct _MMFREE_POOL_ENTRY
371 struct _MMFREE_POOL_ENTRY
*Owner
;
372 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
374 /* Paged pool information */
375 typedef struct _MM_PAGED_POOL_INFO
377 PRTL_BITMAP PagedPoolAllocationMap
;
378 PRTL_BITMAP EndOfPagedPoolBitmap
;
379 PMMPTE FirstPteForPagedPool
;
380 PMMPTE LastPteForPagedPool
;
381 PMMPTE NextPdeForPagedPoolExpansion
;
383 SIZE_T PagedPoolCommit
;
384 SIZE_T AllocatedPagedPool
;
385 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
387 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
390 (*PMM_ALTER_REGION_FUNC
)(
391 PMMSUPPORT AddressSpace
,
401 (*PMM_FREE_PAGE_FUNC
)(
403 PMEMORY_AREA MemoryArea
,
410 /* marea.c *******************************************************************/
415 PMMSUPPORT AddressSpace
,
420 PMEMORY_AREA
*Result
,
421 BOOLEAN FixedAddress
,
422 ULONG AllocationFlags
,
423 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
428 MmLocateMemoryAreaByAddress(
429 PMMSUPPORT AddressSpace
,
436 PMMSUPPORT AddressSpace
,
443 PMMSUPPORT AddressSpace
,
444 PMEMORY_AREA MemoryArea
,
445 PMM_FREE_PAGE_FUNC FreePage
,
446 PVOID FreePageContext
451 MmFreeMemoryAreaByPtr(
452 PMMSUPPORT AddressSpace
,
454 PMM_FREE_PAGE_FUNC FreePage
,
455 PVOID FreePageContext
460 MmDumpMemoryAreas(PMMSUPPORT AddressSpace
);
464 MmLocateMemoryAreaByRegion(
465 PMMSUPPORT AddressSpace
,
473 PMMSUPPORT AddressSpace
,
475 ULONG_PTR Granularity
,
481 MmReleaseMemoryAreaIfDecommitted(
482 struct _EPROCESS
*Process
,
483 PMMSUPPORT AddressSpace
,
489 MmMapMemoryArea(PVOID BaseAddress
,
494 /* npool.c *******************************************************************/
498 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
502 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
506 MiInitializeNonPagedPool(VOID
);
511 IN POOL_TYPE PoolType
,
512 IN SIZE_T SizeInBytes
518 IN PVOID VirtualAddress
524 IN PVOID StartingAddress
534 /* pool.c *******************************************************************/
538 ExAllocateNonPagedPoolWithTag(
547 ExAllocatePagedPoolWithTag(
555 ExFreeNonPagedPool(PVOID block
);
559 ExFreePagedPool(IN PVOID Block
);
563 ExpIsPoolTagDebuggable(ULONG Tag
);
567 ExpAllocateDebugPool(
577 ExpFreeDebugPool(PVOID Block
, BOOLEAN PagedPool
);
581 MmInitializePagedPool(VOID
);
585 MiAllocateSpecialPool(
586 IN POOL_TYPE PoolType
,
587 IN SIZE_T NumberOfBytes
,
595 IN POOL_TYPE PoolType
,
596 IN ULONG CurrentMaxQuota
,
597 OUT PULONG NewMaxQuota
600 /* mdl.c *********************************************************************/
609 /* mminit.c ******************************************************************/
613 MiShutdownMemoryManager(VOID
);
623 MmInitSystem(IN ULONG Phase
,
624 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
628 MiFreeInitMemory(VOID
);
632 MmInitializeMdlImplementation(VOID
);
634 /* pagefile.c ****************************************************************/
638 MmAllocSwapPage(VOID
);
642 MmDereserveSwapPages(ULONG Nr
);
646 MmFreeSwapPage(SWAPENTRY Entry
);
650 MmInitPagingFile(VOID
);
661 MmReserveSwapPages(ULONG Nr
);
674 ULONG BugCodeParameter1
,
675 ULONG BugCodeParameter2
,
676 ULONG BugCodeParameter3
,
677 ULONG BugCodeParameter4
,
678 struct _KTRAP_FRAME
* TrapFrame
683 MmIsAvailableSwapPage(VOID
);
687 MmShowOutOfSpaceMessagePagingFile(VOID
);
689 /* process.c ****************************************************************/
693 MmInitializeProcessAddressSpace(
694 IN PEPROCESS Process
,
695 IN PEPROCESS Clone OPTIONAL
,
696 IN PVOID Section OPTIONAL
,
698 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
703 MmCreatePeb(struct _EPROCESS
*Process
);
708 struct _EPROCESS
*Process
,
710 PINITIAL_TEB InitialTeb
716 struct _EPROCESS
*Process
,
722 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
726 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
730 MmGetSessionLocaleId(VOID
);
734 MmSetMemoryPriorityProcess(
735 IN PEPROCESS Process
,
736 IN UCHAR MemoryPriority
739 /* i386/pfault.c *************************************************************/
751 /* mm.c **********************************************************************/
756 IN BOOLEAN StoreInstruction
,
758 IN KPROCESSOR_MODE Mode
,
759 IN PVOID TrapInformation
762 /* anonmem.c *****************************************************************/
766 MmNotPresentFaultVirtualMemory(
767 PMMSUPPORT AddressSpace
,
768 MEMORY_AREA
* MemoryArea
,
775 MmPageOutVirtualMemory(
776 PMMSUPPORT AddressSpace
,
777 PMEMORY_AREA MemoryArea
,
779 struct _MM_PAGEOP
* PageOp
785 PMEMORY_AREA MemoryArea
,
787 PMEMORY_BASIC_INFORMATION Info
,
794 struct _EPROCESS
* Process
,
795 PMEMORY_AREA MemoryArea
801 PMMSUPPORT AddressSpace
,
802 PMEMORY_AREA MemoryArea
,
811 MmWritePageVirtualMemory(
812 PMMSUPPORT AddressSpace
,
818 /* kmap.c ********************************************************************/
822 ExAllocatePage(VOID
);
826 ExUnmapPage(PVOID Addr
);
830 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
841 MiZeroPage(PFN_TYPE Page
);
843 /* memsafe.s *****************************************************************/
847 MmSafeReadPtr(PVOID Source
);
849 /* pageop.c ******************************************************************/
853 MmReleasePageOp(PMM_PAGEOP PageOp
);
861 PMM_SECTION_SEGMENT Segment
,
873 PMM_SECTION_SEGMENT Segment
,
879 MmInitializePageOp(VOID
);
881 /* process.c *****************************************************************/
885 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
889 MmDeleteKernelStack(PVOID Stack
,
892 /* balace.c ******************************************************************/
896 MmInitializeMemoryConsumer(
898 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
903 MmInitializeBalancer(
904 ULONG NrAvailablePages
,
910 MmReleasePageMemoryConsumer(
917 MmRequestPageMemoryConsumer(
920 PPFN_TYPE AllocatedPage
925 MiInitBalancerThread(VOID
);
929 MmRebalanceMemoryConsumers(VOID
);
931 /* rmap.c **************************************************************/
935 MmSetRmapListHeadPage(
937 struct _MM_RMAP_ENTRY
* ListHead
940 struct _MM_RMAP_ENTRY
*
942 MmGetRmapListHeadPage(PFN_TYPE Page
);
948 struct _EPROCESS
*Process
,
957 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
964 struct _EPROCESS
*Process
,
970 MmInitializeRmapList(VOID
);
974 MmSetCleanAllRmaps(PFN_TYPE Page
);
978 MmSetDirtyAllRmaps(PFN_TYPE Page
);
982 MmIsDirtyPageRmap(PFN_TYPE Page
);
986 MmWritePagePhysicalAddress(PFN_TYPE Page
);
990 MmPageOutPhysicalAddress(PFN_TYPE Page
);
992 /* freelist.c **********************************************************/
994 #define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
998 MiGetPfnEntry(IN PFN_TYPE Pfn
)
1000 PPHYSICAL_PAGE Page
;
1001 extern PPHYSICAL_PAGE MmPageArray
;
1002 extern ULONG MmPageArraySize
;
1004 /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
1005 UNREFERENCED_PARAMETER(MmPageArraySize
);
1007 /* Make sure the PFN number is valid */
1008 ASSERT(Pfn
<= MmPageArraySize
);
1011 Page
= &MmPageArray
[Pfn
];
1013 /* Make sure it's valid */
1022 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
1026 MmGetLRUFirstUserPage(VOID
);
1030 MmInsertLRULastUserPage(PFN_TYPE Page
);
1034 MmRemoveLRUUserPage(PFN_TYPE Page
);
1038 MmLockPage(PFN_TYPE Page
);
1042 MmLockPageUnsafe(PFN_TYPE Page
);
1046 MmUnlockPage(PFN_TYPE Page
);
1050 MmGetLockCountPage(PFN_TYPE Page
);
1056 MmAcquirePageListLock()
1058 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
1064 MmReleasePageListLock(KIRQL oldIrql
)
1066 KeReleaseQueuedSpinLock(LockQueuePfnLock
, oldIrql
);
1071 MmInitializePageList(
1077 MmGetContinuousPages(
1078 ULONG NumberOfBytes
,
1079 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1080 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1081 PHYSICAL_ADDRESS BoundaryAddressMultiple
1086 MmZeroPageThreadMain(
1090 /* hypermap.c *****************************************************************/
1092 extern PEPROCESS HyperProcess
;
1093 extern KIRQL HyperIrql
;
1097 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1103 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1109 MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page
);
1112 // ReactOS Compatibility Layer
1116 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1118 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1119 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1122 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1124 /* i386/page.c *********************************************************/
1128 MmCreateVirtualMappingForKernel(
1137 MmCommitPagedPoolAddress(
1144 MmCreateVirtualMapping(
1145 struct _EPROCESS
* Process
,
1154 MmCreateVirtualMappingUnsafe(
1155 struct _EPROCESS
* Process
,
1165 struct _EPROCESS
* Process
,
1171 struct _EPROCESS
* Process
,
1179 struct _EPROCESS
* Process
,
1185 MmInitGlobalKernelPageDirectory(VOID
);
1189 MmDisableVirtualMapping(
1190 struct _EPROCESS
*Process
,
1198 MmEnableVirtualMapping(
1199 struct _EPROCESS
*Process
,
1205 MmRawDeleteVirtualMapping(PVOID Address
);
1209 MmDeletePageFileMapping(
1210 struct _EPROCESS
*Process
,
1212 SWAPENTRY
* SwapEntry
1217 MmCreatePageFileMapping(
1218 struct _EPROCESS
*Process
,
1226 struct _EPROCESS
*Process
,
1232 MmTransferOwnershipPage(
1240 struct _EPROCESS
*Process
,
1248 SWAPENTRY SavedSwapEntry
1253 MmAllocPagesSpecifyRange(
1255 PHYSICAL_ADDRESS LowestAddress
,
1256 PHYSICAL_ADDRESS HighestAddress
,
1257 ULONG NumberOfPages
,
1263 MmDereferencePage(PFN_TYPE Page
);
1267 MmReferencePage(PFN_TYPE Page
);
1271 MmReferencePageUnsafe(PFN_TYPE Page
);
1275 MmGetReferenceCountPage(PFN_TYPE Page
);
1279 MmIsPageInUse(PFN_TYPE Page
);
1289 MmGetFlagsPage(PFN_TYPE Page
);
1293 MmSetSavedSwapEntryPage(
1295 SWAPENTRY SavedSwapEntry
);
1299 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1304 struct _EPROCESS
*Process
,
1310 MmCreatePageTable(PVOID PAddress
);
1315 struct _EPROCESS
*Process
,
1322 struct _EPROCESS
*Process
,
1328 MmCreateProcessAddressSpace(
1331 IN PULONG_PTR DirectoryTableBase
1336 MmInitializeHandBuiltProcess(
1337 IN PEPROCESS Process
,
1338 IN PULONG_PTR DirectoryTableBase
1344 MmInitializeHandBuiltProcess2(
1345 IN PEPROCESS Process
1350 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1354 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1358 MmDeleteVirtualMapping(
1359 struct _EPROCESS
*Process
,
1369 struct _EPROCESS
*Process
,
1375 MmMarkPageMapped(PFN_TYPE Page
);
1379 MmMarkPageUnmapped(PFN_TYPE Page
);
1384 struct _EPROCESS
*Process
,
1391 MiInitPageDirectoryMap(VOID
);
1395 MiGetUserPageDirectoryCount(VOID
);
1397 /* wset.c ********************************************************************/
1406 /* region.c ************************************************************/
1411 PMMSUPPORT AddressSpace
,
1413 PLIST_ENTRY RegionListHead
,
1418 PMM_ALTER_REGION_FUNC AlterFunc
1424 PLIST_ENTRY RegionListHead
,
1434 PLIST_ENTRY RegionListHead
,
1436 PVOID
* RegionBaseAddress
1439 /* section.c *****************************************************************/
1443 MmGetFileObjectForSection(
1444 IN PROS_SECTION_OBJECT Section
1448 MmGetFileNameForAddress(
1450 OUT PUNICODE_STRING ModuleName
1455 MmGetFileNameForSection(
1456 IN PROS_SECTION_OBJECT Section
,
1457 OUT POBJECT_NAME_INFORMATION
*ModuleName
1470 PMEMORY_AREA MemoryArea
,
1472 PMEMORY_BASIC_INFORMATION Info
,
1473 PSIZE_T ResultLength
1478 MmProtectSectionView(
1479 PMMSUPPORT AddressSpace
,
1480 PMEMORY_AREA MemoryArea
,
1489 MmWritePageSectionView(
1490 PMMSUPPORT AddressSpace
,
1498 MmInitSectionImplementation(VOID
);
1502 MmNotPresentFaultSectionView(
1503 PMMSUPPORT AddressSpace
,
1504 MEMORY_AREA
* MemoryArea
,
1511 MmPageOutSectionView(
1512 PMMSUPPORT AddressSpace
,
1513 PMEMORY_AREA MemoryArea
,
1515 struct _MM_PAGEOP
*PageOp
1520 MmCreatePhysicalMemorySection(VOID
);
1524 MmAccessFaultSectionView(
1525 PMMSUPPORT AddressSpace
,
1526 MEMORY_AREA
* MemoryArea
,
1533 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1535 /* mpw.c *********************************************************************/
1539 MmInitMpwThread(VOID
);
1543 MmInitBsmThread(VOID
);
1545 /* pager.c *******************************************************************/
1549 MiIsPagerThread(VOID
);
1553 MiStartPagerThread(VOID
);
1557 MiStopPagerThread(VOID
);
1561 MiQueryVirtualMemory(
1562 IN HANDLE ProcessHandle
,
1564 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1565 OUT PVOID VirtualMemoryInformation
,
1567 OUT PSIZE_T ResultLength
1570 /* sysldr.c ******************************************************************/
1574 MiReloadBootLoadedDrivers(
1575 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1580 MiInitializeLoadedModuleList(
1581 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1587 IN PUNICODE_STRING FileName
,
1588 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1589 IN PUNICODE_STRING LoadedName OPTIONAL
,
1591 OUT PVOID
*ModuleObject
,
1592 OUT PVOID
*ImageBaseAddress
1597 MmUnloadSystemImage(
1598 IN PVOID ImageHandle
1604 IN HANDLE ImageHandle
,
1605 IN BOOLEAN PurgeSection
1610 MmCallDllInitialize(
1611 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1612 IN PLIST_ENTRY ListHead
1615 /* ReactOS Mm Hacks */
1618 MiSyncForProcessAttach(
1619 IN PKTHREAD NextThread
,
1620 IN PEPROCESS Process
1625 MiSyncForContextSwitch(
1629 extern PMMSUPPORT MmKernelAddressSpace
;
1633 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1635 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1640 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1642 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1647 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1649 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1650 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1655 MmGetCurrentAddressSpace(VOID
)
1657 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1662 MmGetKernelAddressSpace(VOID
)
1664 return MmKernelAddressSpace
;