1 #ifndef __INCLUDE_INTERNAL_MM_H
2 #define __INCLUDE_INTERNAL_MM_H
4 #include <internal/arch/mm.h>
6 /* TYPES *********************************************************************/
8 extern ULONG MiFreeSwapPages
;
9 extern ULONG MiUsedSwapPages
;
10 extern ULONG MmPagedPoolSize
;
11 extern ULONG MmTotalPagedPoolQuota
;
12 extern ULONG MmTotalNonPagedPoolQuota
;
13 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
15 extern PVOID MmPagedPoolBase
;
16 extern ULONG MmPagedPoolSize
;
20 struct _MM_RMAP_ENTRY
;
22 typedef ULONG SWAPENTRY
;
23 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
25 #define MEMORY_AREA_INVALID (0)
26 #define MEMORY_AREA_SECTION_VIEW (1)
27 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
28 #define MEMORY_AREA_NO_CACHE (3)
29 #define MEMORY_AREA_IO_MAPPING (4)
30 #define MEMORY_AREA_SYSTEM (5)
31 #define MEMORY_AREA_MDL_MAPPING (7)
32 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
33 #define MEMORY_AREA_CACHE_SEGMENT (9)
34 #define MEMORY_AREA_SHARED_DATA (10)
35 #define MEMORY_AREA_KERNEL_STACK (11)
36 #define MEMORY_AREA_PAGED_POOL (12)
37 #define MEMORY_AREA_NO_ACCESS (13)
38 #define MEMORY_AREA_PEB_OR_TEB (14)
40 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
42 #define MM_CORE_DUMP_TYPE_NONE (0x0)
43 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
44 #define MM_CORE_DUMP_TYPE_FULL (0x2)
46 #define MM_PAGEOP_PAGEIN (1)
47 #define MM_PAGEOP_PAGEOUT (2)
48 #define MM_PAGEOP_PAGESYNCH (3)
49 #define MM_PAGEOP_ACCESSFAULT (4)
51 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
54 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
55 ((((x)) % (4*1024*1024)) / (4*1024))
57 #define NR_SECTION_PAGE_TABLES 1024
58 #define NR_SECTION_PAGE_ENTRIES 1024
60 #define TEB_BASE 0x7FFDE000
61 #define KPCR_BASE 0xFF000000
63 /* Although Microsoft says this isn't hardcoded anymore,
64 they won't be able to change it. Stuff depends on it */
65 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
67 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
70 * Additional flags for protection attributes
72 #define PAGE_WRITETHROUGH (1024)
73 #define PAGE_SYSTEM (2048)
75 #define SEC_PHYSICALMEMORY (0x80000000)
77 #define MM_PAGEFILE_SEGMENT (0x1)
78 #define MM_DATAFILE_SEGMENT (0x2)
84 #define MC_MAXIMUM (4)
86 #define PAGED_POOL_MASK 1
87 #define MUST_SUCCEED_POOL_MASK 2
88 #define CACHE_ALIGNED_POOL_MASK 4
89 #define QUOTA_POOL_MASK 8
90 #define SESSION_POOL_MASK 32
91 #define VERIFIER_POOL_MASK 64
93 #define MM_PAGED_POOL_SIZE (100*1024*1024)
94 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
97 * Paged and non-paged pools are 8-byte aligned
99 #define MM_POOL_ALIGNMENT 8
102 * Maximum size of the kmalloc area (this is totally arbitary)
104 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
105 #define MM_KERNEL_MAP_BASE (0xf0c00000)
108 * FIXME - different architectures have different cache line sizes...
110 #define MM_CACHE_LINE_SIZE 32
112 #define MM_ROUND_UP(x,s) \
113 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
115 #define MM_ROUND_DOWN(x,s) \
116 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
118 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
123 PAGE_EXECUTE_READ | \
124 PAGE_EXECUTE_READWRITE | \
125 PAGE_EXECUTE_WRITECOPY | \
130 #define PAGE_IS_READABLE \
134 PAGE_EXECUTE_READ | \
135 PAGE_EXECUTE_READWRITE | \
136 PAGE_EXECUTE_WRITECOPY)
138 #define PAGE_IS_WRITABLE \
141 PAGE_EXECUTE_READWRITE | \
142 PAGE_EXECUTE_WRITECOPY)
144 #define PAGE_IS_EXECUTABLE \
146 PAGE_EXECUTE_READ | \
147 PAGE_EXECUTE_READWRITE | \
148 PAGE_EXECUTE_WRITECOPY)
150 #define PAGE_IS_WRITECOPY \
152 PAGE_EXECUTE_WRITECOPY)
156 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
157 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
161 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
162 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
164 typedef struct _MM_SECTION_SEGMENT
167 ULONG_PTR VirtualAddress
;
172 ULONG ReferenceCount
;
173 SECTION_PAGE_DIRECTORY PageDirectory
;
175 ULONG Characteristics
;
177 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
179 typedef struct _MM_IMAGE_SECTION_OBJECT
182 ULONG_PTR StackReserve
;
183 ULONG_PTR StackCommit
;
184 ULONG_PTR EntryPoint
;
186 ULONG ImageCharacteristics
;
187 USHORT MinorSubsystemVersion
;
188 USHORT MajorSubsystemVersion
;
192 PMM_SECTION_SEGMENT Segments
;
193 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
195 typedef struct _SECTION_OBJECT
199 LARGE_INTEGER MaximumSize
;
200 ULONG SectionPageProtection
;
201 ULONG AllocationAttributes
;
202 PFILE_OBJECT FileObject
;
205 PMM_IMAGE_SECTION_OBJECT ImageSection
;
206 PMM_SECTION_SEGMENT Segment
;
210 typedef struct _MEMORY_AREA
212 PVOID StartingAddress
;
214 struct _MEMORY_AREA
*Parent
;
215 struct _MEMORY_AREA
*LeftChild
;
216 struct _MEMORY_AREA
*RightChild
;
221 BOOLEAN DeleteInProgress
;
227 SECTION_OBJECT
* Section
;
229 PMM_SECTION_SEGMENT Segment
;
230 BOOLEAN WriteCopyView
;
231 LIST_ENTRY RegionListHead
;
235 LIST_ENTRY RegionListHead
;
238 } MEMORY_AREA
, *PMEMORY_AREA
;
241 typedef struct _MADDRESS_SPACE
243 PMEMORY_AREA MemoryAreaRoot
;
246 struct _EPROCESS
* Process
;
247 PUSHORT PageTableRefCountTable
;
248 ULONG PageTableRefCountTableSize
;
249 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
256 ULONG NrReservedPages
;
261 ULONG PagingRequestsInLastMinute
;
262 ULONG PagingRequestsInLastFiveMinutes
;
263 ULONG PagingRequestsInLastFifteenMinutes
;
266 extern MM_STATS MmStats
;
268 typedef struct _MM_PAGEOP
270 /* Type of operation. */
272 /* Number of threads interested in this operation. */
273 ULONG ReferenceCount
;
274 /* Event that will be set when the operation is completed. */
275 KEVENT CompletionEvent
;
276 /* Status of the operation once it is completed. */
278 /* TRUE if the operation was abandoned. */
280 /* The memory area to be affected by the operation. */
283 struct _MM_PAGEOP
* Next
;
284 struct _ETHREAD
* Thread
;
286 * These fields are used to identify the operation if it is against a
287 * virtual memory area.
292 * These fields are used to identify the operation if it is against a
295 PMM_SECTION_SEGMENT Segment
;
297 } MM_PAGEOP
, *PMM_PAGEOP
;
299 typedef struct _MM_MEMORY_CONSUMER
303 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
304 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
306 typedef struct _MM_REGION
311 LIST_ENTRY RegionListEntry
;
312 } MM_REGION
, *PMM_REGION
;
314 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
317 (*PMM_ALTER_REGION_FUNC
)(
318 PMADDRESS_SPACE AddressSpace
,
328 (*PMM_FREE_PAGE_FUNC
)(
330 PMEMORY_AREA MemoryArea
,
340 /* aspace.c ******************************************************************/
344 MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
348 MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
352 MmInitializeKernelAddressSpace(VOID
);
356 MmGetCurrentAddressSpace(VOID
);
360 MmGetKernelAddressSpace(VOID
);
364 MmInitializeAddressSpace(
365 struct _EPROCESS
* Process
,
366 PMADDRESS_SPACE AddressSpace
);
370 MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
372 /* marea.c *******************************************************************/
376 MmInitMemoryAreas(VOID
);
381 PMADDRESS_SPACE AddressSpace
,
386 PMEMORY_AREA
*Result
,
387 BOOLEAN FixedAddress
,
388 ULONG AllocationFlags
,
389 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
394 MmLocateMemoryAreaByAddress(
395 PMADDRESS_SPACE AddressSpace
,
402 PMADDRESS_SPACE AddressSpace
,
409 PMADDRESS_SPACE AddressSpace
,
410 PMEMORY_AREA MemoryArea
,
411 PMM_FREE_PAGE_FUNC FreePage
,
412 PVOID FreePageContext
417 MmFreeMemoryAreaByPtr(
418 PMADDRESS_SPACE AddressSpace
,
420 PMM_FREE_PAGE_FUNC FreePage
,
421 PVOID FreePageContext
426 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
430 MmLocateMemoryAreaByRegion(
431 PMADDRESS_SPACE AddressSpace
,
439 PMADDRESS_SPACE AddressSpace
,
441 ULONG_PTR Granularity
,
447 MmReleaseMemoryAreaIfDecommitted(
449 PMADDRESS_SPACE AddressSpace
,
453 /* npool.c *******************************************************************/
457 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
461 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
465 MiInitializeNonPagedPool(VOID
);
474 /* pool.c *******************************************************************/
478 ExAllocateNonPagedPoolWithTag(
487 ExAllocatePagedPoolWithTag(
495 ExFreeNonPagedPool(PVOID block
);
499 ExFreePagedPool(IN PVOID Block
);
503 MmInitializePagedPool(VOID
);
507 MiAllocateSpecialPool(
508 IN POOL_TYPE PoolType
,
509 IN SIZE_T NumberOfBytes
,
517 IN POOL_TYPE PoolType
,
518 IN ULONG CurrentMaxQuota
,
519 OUT PULONG NewMaxQuota
522 /* mdl.c *********************************************************************/
531 /* mminit.c ******************************************************************/
535 MiShutdownMemoryManager(VOID
);
540 ULONG_PTR FirstKernelPhysAddress
,
541 ULONG_PTR LastKernelPhysAddress
,
542 ULONG_PTR LastKernelAddress
,
543 PADDRESS_RANGE BIOSMemoryMap
,
544 ULONG AddressRangeCount
,
558 MiFreeInitMemory(VOID
);
562 MmInitializeMdlImplementation(VOID
);
564 /* pagefile.c ****************************************************************/
568 MmAllocSwapPage(VOID
);
572 MmDereserveSwapPages(ULONG Nr
);
576 MmFreeSwapPage(SWAPENTRY Entry
);
580 MmInitPagingFile(VOID
);
591 MmReserveSwapPages(ULONG Nr
);
604 ULONG BugCodeParameter1
,
605 ULONG BugCodeParameter2
,
606 ULONG BugCodeParameter3
,
607 ULONG BugCodeParameter4
,
608 struct _KTRAP_FRAME
* TrapFrame
613 MmIsAvailableSwapPage(VOID
);
617 MmShowOutOfSpaceMessagePagingFile(VOID
);
619 /* process.c ****************************************************************/
623 MmCreateProcessAddressSpace(
624 IN
struct _EPROCESS
* Process
,
625 IN PSECTION_OBJECT Section OPTIONAL
630 MmCreatePeb(PEPROCESS Process
);
637 PINITIAL_TEB InitialTeb
647 /* i386/pfault.c *************************************************************/
659 /* mm.c **********************************************************************/
664 KPROCESSOR_MODE Mode
,
672 KPROCESSOR_MODE Mode
,
677 /* anonmem.c *****************************************************************/
681 MmNotPresentFaultVirtualMemory(
682 PMADDRESS_SPACE AddressSpace
,
683 MEMORY_AREA
* MemoryArea
,
690 MmPageOutVirtualMemory(
691 PMADDRESS_SPACE AddressSpace
,
692 PMEMORY_AREA MemoryArea
,
694 struct _MM_PAGEOP
* PageOp
700 PMEMORY_AREA MemoryArea
,
702 PMEMORY_BASIC_INFORMATION Info
,
709 struct _EPROCESS
* Process
,
710 PMEMORY_AREA MemoryArea
716 PMADDRESS_SPACE AddressSpace
,
717 PMEMORY_AREA MemoryArea
,
726 MmWritePageVirtualMemory(
727 PMADDRESS_SPACE AddressSpace
,
733 /* kmap.c ********************************************************************/
737 ExAllocatePage(VOID
);
741 ExUnmapPage(PVOID Addr
);
745 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
756 MiZeroPage(PFN_TYPE Page
);
758 /* memsafe.s *****************************************************************/
762 MmSafeReadPtr(PVOID Source
);
764 /* pageop.c ******************************************************************/
768 MmReleasePageOp(PMM_PAGEOP PageOp
);
776 PMM_SECTION_SEGMENT Segment
,
788 PMM_SECTION_SEGMENT Segment
,
794 MmInitializePageOp(VOID
);
796 /* process.c *****************************************************************/
800 MmCreateKernelStack(BOOLEAN GuiStack
);
804 MmDeleteKernelStack(PVOID Stack
,
807 /* balace.c ******************************************************************/
811 MmInitializeMemoryConsumer(
813 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
818 MmInitializeBalancer(
819 ULONG NrAvailablePages
,
825 MmReleasePageMemoryConsumer(
832 MmRequestPageMemoryConsumer(
835 PPFN_TYPE AllocatedPage
840 MiInitBalancerThread(VOID
);
844 MmRebalanceMemoryConsumers(VOID
);
846 /* rmap.c **************************************************************/
850 MmSetRmapListHeadPage(
852 struct _MM_RMAP_ENTRY
* ListHead
855 struct _MM_RMAP_ENTRY
*
857 MmGetRmapListHeadPage(PFN_TYPE Page
);
872 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
)
885 MmInitializeRmapList(VOID
);
889 MmSetCleanAllRmaps(PFN_TYPE Page
);
893 MmSetDirtyAllRmaps(PFN_TYPE Page
);
897 MmIsDirtyPageRmap(PFN_TYPE Page
);
901 MmWritePagePhysicalAddress(PFN_TYPE Page
);
905 MmPageOutPhysicalAddress(PFN_TYPE Page
);
907 /* freelist.c **********************************************************/
911 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
915 MmGetLRUFirstUserPage(VOID
);
919 MmSetLRULastPage(PFN_TYPE Page
);
923 MmLockPage(PFN_TYPE Page
);
927 MmLockPageUnsafe(PFN_TYPE Page
);
931 MmUnlockPage(PFN_TYPE Page
);
935 MmGetLockCountPage(PFN_TYPE Page
);
939 MmInitializePageList(
940 ULONG_PTR FirstPhysKernelAddress
,
941 ULONG_PTR LastPhysKernelAddress
,
942 ULONG MemorySizeInPages
,
943 ULONG_PTR LastKernelBase
,
944 PADDRESS_RANGE BIOSMemoryMap
,
945 ULONG AddressRangeCount
950 MmGetContinuousPages(
952 PHYSICAL_ADDRESS LowestAcceptableAddress
,
953 PHYSICAL_ADDRESS HighestAcceptableAddress
,
954 PHYSICAL_ADDRESS BoundaryAddressMultiple
959 MmInitZeroPageThread(VOID
);
961 /* i386/page.c *********************************************************/
965 MmCreateHyperspaceMapping(PFN_TYPE Page
);
969 MmChangeHyperspaceMapping(
976 MmDeleteHyperspaceMapping(PVOID Address
);
980 MmCreateVirtualMappingForKernel(
989 MmCommitPagedPoolAddress(
996 MmCreateVirtualMapping(
997 struct _EPROCESS
* Process
,
1006 MmCreateVirtualMappingUnsafe(
1007 struct _EPROCESS
* Process
,
1017 struct _EPROCESS
* Process
,
1023 struct _EPROCESS
* Process
,
1031 struct _EPROCESS
* Process
,
1037 MmInitGlobalKernelPageDirectory(VOID
);
1041 MmDisableVirtualMapping(
1050 MmEnableVirtualMapping(
1057 MmRawDeleteVirtualMapping(PVOID Address
);
1061 MmDeletePageFileMapping(
1064 SWAPENTRY
* SwapEntry
1069 MmCreatePageFileMapping(
1084 MmTransferOwnershipPage(
1100 SWAPENTRY SavedSwapEntry
1105 MmAllocPagesSpecifyRange(
1107 PHYSICAL_ADDRESS LowestAddress
,
1108 PHYSICAL_ADDRESS HighestAddress
,
1109 ULONG NumberOfPages
,
1115 MmDereferencePage(PFN_TYPE Page
);
1119 MmReferencePage(PFN_TYPE Page
);
1123 MmReferencePageUnsafe(PFN_TYPE Page
);
1127 MmIsAccessedAndResetAccessPage(
1134 MmGetReferenceCountPage(PFN_TYPE Page
);
1138 MmIsUsablePage(PFN_TYPE Page
);
1148 MmGetFlagsPage(PFN_TYPE Page
);
1152 MmSetSavedSwapEntryPage(
1154 SWAPENTRY SavedSwapEntry
);
1158 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1169 MmCreatePageTable(PVOID PAddress
);
1190 PPHYSICAL_ADDRESS DirectoryTableBase
1195 MmReleaseMmInfo(PEPROCESS Process
);
1199 Mmi386ReleaseMmInfo(PEPROCESS Process
);
1203 MmDeleteVirtualMapping(
1220 MmMarkPageMapped(PFN_TYPE Page
);
1224 MmMarkPageUnmapped(PFN_TYPE Page
);
1236 MiInitPageDirectoryMap(VOID
);
1240 MiGetUserPageDirectoryCount(VOID
);
1242 /* wset.c ********************************************************************/
1251 /* cont.c ********************************************************************/
1255 MmAllocateContiguousMemorySpecifyCache(
1256 IN SIZE_T NumberOfBytes
,
1257 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
1258 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
1259 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
1260 IN MEMORY_CACHING_TYPE CacheType OPTIONAL
1263 /* region.c ************************************************************/
1268 PMADDRESS_SPACE AddressSpace
,
1270 PLIST_ENTRY RegionListHead
,
1275 PMM_ALTER_REGION_FUNC AlterFunc
1281 PLIST_ENTRY RegionListHead
,
1291 PLIST_ENTRY RegionListHead
,
1293 PVOID
* RegionBaseAddress
1296 /* section.c *****************************************************************/
1308 PMEMORY_AREA MemoryArea
,
1310 PMEMORY_BASIC_INFORMATION Info
,
1316 MmProtectSectionView(
1317 PMADDRESS_SPACE AddressSpace
,
1318 PMEMORY_AREA MemoryArea
,
1327 MmWritePageSectionView(
1328 PMADDRESS_SPACE AddressSpace
,
1336 MmInitSectionImplementation(VOID
);
1341 OUT PSECTION_OBJECT
*SectionObject
,
1342 IN ACCESS_MASK DesiredAccess
,
1343 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
1344 IN PLARGE_INTEGER MaximumSize
,
1345 IN ULONG SectionPageProtection
,
1346 IN ULONG AllocationAttributes
,
1347 IN HANDLE FileHandle OPTIONAL
,
1348 IN PFILE_OBJECT File OPTIONAL
1353 MmNotPresentFaultSectionView(
1354 PMADDRESS_SPACE AddressSpace
,
1355 MEMORY_AREA
* MemoryArea
,
1362 MmPageOutSectionView(
1363 PMADDRESS_SPACE AddressSpace
,
1364 PMEMORY_AREA MemoryArea
,
1366 struct _MM_PAGEOP
*PageOp
1371 MmCreatePhysicalMemorySection(VOID
);
1375 MmAccessFaultSectionView(
1376 PMADDRESS_SPACE AddressSpace
,
1377 MEMORY_AREA
* MemoryArea
,
1384 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1386 /* mpw.c *********************************************************************/
1390 MmInitMpwThread(VOID
);
1392 /* pager.c *******************************************************************/
1396 MiIsPagerThread(VOID
);
1400 MiStartPagerThread(VOID
);
1404 MiStopPagerThread(VOID
);
1408 MiQueryVirtualMemory(
1409 IN HANDLE ProcessHandle
,
1411 IN CINT VirtualMemoryInformationClass
,
1412 OUT PVOID VirtualMemoryInformation
,
1414 OUT PULONG ResultLength