2 * Higher level memory managment definitions
5 #ifndef __INCLUDE_INTERNAL_MM_H
6 #define __INCLUDE_INTERNAL_MM_H
8 #include <internal/ntoskrnl.h>
9 #include <internal/arch/mm.h>
11 /* TYPES *********************************************************************/
15 struct _MM_RMAP_ENTRY
;
17 typedef ULONG SWAPENTRY
;
19 #define MEMORY_AREA_INVALID (0)
20 #define MEMORY_AREA_SECTION_VIEW_COMMIT (1)
21 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
22 #define MEMORY_AREA_NO_CACHE (3)
23 #define MEMORY_AREA_IO_MAPPING (4)
24 #define MEMORY_AREA_SYSTEM (5)
25 #define MEMORY_AREA_MDL_MAPPING (7)
26 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
27 #define MEMORY_AREA_SECTION_VIEW_RESERVE (9)
28 #define MEMORY_AREA_CACHE_SEGMENT (10)
29 #define MEMORY_AREA_SHARED_DATA (11)
30 #define MEMORY_AREA_WORKING_SET (12)
31 #define MEMORY_AREA_KERNEL_STACK (13)
32 #define MEMORY_AREA_PAGED_POOL (14)
34 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
36 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
37 ((((x)) % (4*1024*1024)) / (4*1024))
39 #define NR_SECTION_PAGE_TABLES (1024)
40 #define NR_SECTION_PAGE_ENTRIES (1024)
43 * Flags for section objects
45 #define SO_PHYSICAL_MEMORY (0x1)
48 * Additional flags for protection attributes
50 #define PAGE_WRITETHROUGH (1024)
51 #define PAGE_SYSTEM (2048)
52 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
57 PAGE_EXECUTE_READWRITE | \
58 PAGE_EXECUTE_WRITECOPY | \
65 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
66 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
70 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
71 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
73 #define MM_PAGEFILE_SECTION (0x1)
74 #define MM_IMAGE_SECTION (0x2)
76 #define MM_SECTION_SEGMENT_BSS (0x1)
78 typedef struct _MM_SECTION_SEGMENT
87 SECTION_PAGE_DIRECTORY PageDirectory
;
90 ULONG Characteristics
;
92 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
98 LARGE_INTEGER MaximumSize
;
99 ULONG SectionPageProtection
;
100 ULONG AllocateAttributes
;
101 PFILE_OBJECT FileObject
;
102 LIST_ENTRY ViewListHead
;
103 KSPIN_LOCK ViewListLock
;
107 PMM_SECTION_SEGMENT Segments
;
113 ULONG MinorSubsystemVersion
;
114 ULONG MajorSubsystemVersion
;
115 ULONG ImageCharacteristics
;
118 } SECTION_OBJECT
, *PSECTION_OBJECT
;
128 struct _EPROCESS
* Process
;
133 SECTION_OBJECT
* Section
;
135 LIST_ENTRY ViewListEntry
;
136 PMM_SECTION_SEGMENT Segment
;
137 BOOLEAN WriteCopyView
;
141 LIST_ENTRY SegmentListHead
;
144 } MEMORY_AREA
, *PMEMORY_AREA
;
146 typedef struct _MADDRESS_SPACE
148 LIST_ENTRY MAreaListHead
;
151 struct _EPROCESS
* Process
;
152 PUSHORT PageTableRefCountTable
;
153 ULONG PageTableRefCountTableSize
;
154 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
158 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
159 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
160 VOID
MmInitializeKernelAddressSpace(VOID
);
161 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
162 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
163 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
164 PMADDRESS_SPACE AddressSpace
);
165 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
166 PVOID STDCALL
MmAllocateSection (IN ULONG Length
);
167 NTSTATUS
MmCreateMemoryArea(struct _EPROCESS
* Process
,
168 PMADDRESS_SPACE AddressSpace
,
173 MEMORY_AREA
** Result
,
175 MEMORY_AREA
* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace
,
177 NTSTATUS
MmInitMemoryAreas(VOID
);
178 VOID
ExInitNonPagedPool(ULONG BaseAddress
);
179 NTSTATUS
MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace
,
182 VOID (*FreePage
)(PVOID Context
, MEMORY_AREA
* MemoryArea
,
183 PVOID Address
, ULONG PhysAddr
, SWAPENTRY SwapEntry
,
185 PVOID FreePageContext
);
186 VOID
MmDumpMemoryAreas(PLIST_ENTRY ListHead
);
187 NTSTATUS
MmLockMemoryArea(MEMORY_AREA
* MemoryArea
);
188 NTSTATUS
MmUnlockMemoryArea(MEMORY_AREA
* MemoryArea
);
189 NTSTATUS
MmInitSectionImplementation(VOID
);
191 #define MM_LOWEST_USER_ADDRESS (4096)
193 PMEMORY_AREA
MmSplitMemoryArea(struct _EPROCESS
* Process
,
194 PMADDRESS_SPACE AddressSpace
,
195 PMEMORY_AREA OriginalMemoryArea
,
199 ULONG NewAttributes
);
200 PVOID
MmInitializePageList(PVOID FirstPhysKernelAddress
,
201 PVOID LastPhysKernelAddress
,
202 ULONG MemorySizeInPages
,
203 ULONG LastKernelBase
,
204 PADDRESS_RANGE BIOSMemoryMap
,
205 ULONG AddressRangeCount
);
208 MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
209 VOID
MmDereferencePage(PVOID PhysicalAddress
);
210 VOID
MmReferencePage(PVOID PhysicalAddress
);
211 VOID
MmDeletePageTable(struct _EPROCESS
* Process
,
213 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
,
214 struct _EPROCESS
* Dest
);
215 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
216 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
218 MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
222 ULONG
* PhysicalPage
);
224 #define MM_PAGE_CLEAN (0)
225 #define MM_PAGE_DIRTY (1)
227 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
228 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
229 VOID
MiShutdownMemoryManager(VOID
);
230 ULONG
MmGetPhysicalAddressForProcess(struct _EPROCESS
* Process
,
233 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
234 VOID
MmInitPagingFile(VOID
);
236 /* FIXME: it should be in ddk/mmfuncs.h */
240 OUT PSECTION_OBJECT
* SectionObject
,
241 IN ACCESS_MASK DesiredAccess
,
242 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
243 IN PLARGE_INTEGER MaximumSize
,
244 IN ULONG SectionPageProtection
,
245 IN ULONG AllocationAttributes
,
246 IN HANDLE FileHandle OPTIONAL
,
247 IN PFILE_OBJECT File OPTIONAL
250 NTSTATUS
MmPageFault(ULONG Cs
,
257 MmAccessFault(KPROCESSOR_MODE Mode
,
261 MmNotPresentFault(KPROCESSOR_MODE Mode
,
265 MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
266 MEMORY_AREA
* MemoryArea
,
270 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
271 MEMORY_AREA
* MemoryArea
,
274 NTSTATUS
MmWaitForPage(PVOID Page
);
275 VOID
MmClearWaitPage(PVOID Page
);
276 VOID
MmSetWaitPage(PVOID Page
);
277 BOOLEAN
MmIsPageDirty(struct _EPROCESS
* Process
, PVOID Address
);
278 BOOLEAN
MmIsPageTablePresent(PVOID PAddress
);
280 MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
281 PMEMORY_AREA MemoryArea
,
283 struct _MM_PAGEOP
* PageOp
);
285 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
286 PMEMORY_AREA MemoryArea
,
288 struct _MM_PAGEOP
* PageOp
);
289 MEMORY_AREA
* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace
,
293 VOID
ExUnmapPage(PVOID Addr
);
294 PVOID
ExAllocatePage(VOID
);
296 VOID
MmInitPagingFile(VOID
);
297 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
298 VOID
MmDereserveSwapPages(ULONG Nr
);
299 SWAPENTRY
MmAllocSwapPage(VOID
);
300 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
302 VOID
MmInit1(ULONG FirstKernelPhysAddress
,
303 ULONG LastKernelPhysAddress
,
304 ULONG LastKernelAddress
,
305 PADDRESS_RANGE BIOSMemoryMap
,
306 ULONG AddressRangeCount
);
309 NTSTATUS
MmInitPagerThread(VOID
);
311 VOID
MmInitKernelMap(PVOID BaseAddress
);
312 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
318 ULONG NrReservedPages
;
323 ULONG PagingRequestsInLastMinute
;
324 ULONG PagingRequestsInLastFiveMinutes
;
325 ULONG PagingRequestsInLastFifteenMinutes
;
328 extern MM_STATS MmStats
;
331 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
335 MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
339 MmGetDirtyPagesFromWorkingSet(struct _EPROCESS
* Process
);
341 MmWriteToSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
343 MmReadFromSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
345 MmSetFlagsPage(PVOID PhysicalAddress
, ULONG Flags
);
347 MmGetFlagsPage(PVOID PhysicalAddress
);
348 VOID
MmSetSavedSwapEntryPage(PVOID PhysicalAddress
,
349 SWAPENTRY SavedSwapEntry
);
350 SWAPENTRY
MmGetSavedSwapEntryPage(PVOID PhysicalAddress
);
351 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
352 VOID
MmLockPage(PVOID PhysicalPage
);
353 VOID
MmUnlockPage(PVOID PhysicalPage
);
355 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, PVOID Src
, ULONG Count
);
356 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, PVOID Src
, ULONG Count
);
358 MmCreatePhysicalMemorySection(VOID
);
360 MmGetContinuousPages(ULONG NumberOfBytes
,
361 PHYSICAL_ADDRESS HighestAcceptableAddress
,
364 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
367 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
368 MEMORY_AREA
* MemoryArea
,
372 MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
374 ExAllocatePageWithPhysPage(ULONG PhysPage
);
376 MmGetReferenceCountPage(PVOID PhysicalAddress
);
378 MmIsUsablePage(PVOID PhysicalAddress
);
380 #define MM_PAGEOP_PAGEIN (1)
381 #define MM_PAGEOP_PAGEOUT (2)
382 #define MM_PAGEOP_PAGESYNCH (3)
383 #define MM_PAGEOP_ACCESSFAULT (4)
385 typedef struct _MM_PAGEOP
387 /* Type of operation. */
389 /* Number of threads interested in this operation. */
390 ULONG ReferenceCount
;
391 /* Event that will be set when the operation is completed. */
392 KEVENT CompletionEvent
;
393 /* Status of the operation once it is completed. */
395 /* TRUE if the operation was abandoned. */
397 /* The memory area to be affected by the operation. */
400 struct _MM_PAGEOP
* Next
;
401 struct _ETHREAD
* Thread
;
403 * These fields are used to identify the operation if it is against a
404 * virtual memory area.
409 * These fields are used to identify the operation if it is against a
412 PMM_SECTION_SEGMENT Segment
;
414 } MM_PAGEOP
, *PMM_PAGEOP
;
417 MmReleasePageOp(PMM_PAGEOP PageOp
);
420 MmGetPageOp(PMEMORY_AREA MArea
, ULONG Pid
, PVOID Address
,
421 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
);
424 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
426 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
428 MmMarkPageMapped(PVOID PhysicalAddress
);
430 MmMarkPageUnmapped(PVOID PhysicalAddress
);
432 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
434 typedef struct _MM_IMAGE_SECTION_OBJECT
437 MM_SECTION_SEGMENT Segments
[0];
438 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
441 MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
443 MiCopyFromUserPage(ULONG DestPhysPage
, PVOID SourceAddress
);
445 MiZeroPage(ULONG PhysPage
);
447 MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
449 MmGetSavedSwapEntryPage(PVOID PhysicalAddress
);
451 #define STATUS_MM_RESTART_OPERATION (0xD0000001)
454 MmCreateVirtualMappingForKernel(PVOID Address
,
456 ULONG PhysicalAddress
);
457 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
);
459 /* Memory balancing. */
461 MmInitializeMemoryConsumer(ULONG Consumer
,
462 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
,
465 MmInitializeBalancer(ULONG NrAvailablePages
);
467 MmReleasePageMemoryConsumer(ULONG Consumer
, PVOID Page
);
469 MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN CanWait
, PVOID
* AllocatedPage
);
474 #define MC_NPPOOL (3)
475 #define MC_MAXIMUM (4)
478 MmSetRmapListHeadPage(PVOID PhysicalAddress
, struct _MM_RMAP_ENTRY
* ListHead
);
479 struct _MM_RMAP_ENTRY
*
480 MmGetRmapListHeadPage(PVOID PhysicalAddress
);
482 MmInsertRmap(PVOID PhysicalAddress
, PEPROCESS Process
, PVOID Address
);
484 MmDeleteAllRmaps(PVOID PhysicalAddress
, PVOID Context
,
485 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
487 MmDeleteRmap(PVOID PhysicalAddress
, PEPROCESS Process
, PVOID Address
);
489 MmInitializeRmapList(VOID
);
491 MmGetLRUNextUserPage(PVOID PreviousPhysicalAddress
);
493 MmGetLRUFirstUserPage(VOID
);
495 MmPageOutPhysicalAddress(PVOID PhysicalAddress
);
497 MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
500 MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, ULONG
* PhysicalAddr
);
501 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
503 MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
505 MmCreatePageFileMapping(PEPROCESS Process
,
507 SWAPENTRY SwapEntry
);
508 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);