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)
44 * Additional flags for protection attributes
46 #define PAGE_WRITETHROUGH (1024)
47 #define PAGE_SYSTEM (2048)
48 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
53 PAGE_EXECUTE_READWRITE | \
54 PAGE_EXECUTE_WRITECOPY | \
61 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
62 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
66 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
67 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
69 #define MM_PAGEFILE_SECTION (0x1)
70 #define MM_IMAGE_SECTION (0x2)
72 * Flags for section objects
74 #define SO_PHYSICAL_MEMORY (0x4)
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
;
129 BOOLEAN DeleteInProgress
;
135 SECTION_OBJECT
* Section
;
137 LIST_ENTRY ViewListEntry
;
138 PMM_SECTION_SEGMENT Segment
;
139 BOOLEAN WriteCopyView
;
143 LIST_ENTRY SegmentListHead
;
146 } MEMORY_AREA
, *PMEMORY_AREA
;
148 typedef struct _MADDRESS_SPACE
150 LIST_ENTRY MAreaListHead
;
153 struct _EPROCESS
* Process
;
154 PUSHORT PageTableRefCountTable
;
155 ULONG PageTableRefCountTableSize
;
156 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
160 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
161 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
162 VOID
MmInitializeKernelAddressSpace(VOID
);
163 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
164 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
165 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
166 PMADDRESS_SPACE AddressSpace
);
167 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
168 PVOID STDCALL
MmAllocateSection (IN ULONG Length
);
169 NTSTATUS
MmCreateMemoryArea(struct _EPROCESS
* Process
,
170 PMADDRESS_SPACE AddressSpace
,
175 MEMORY_AREA
** Result
,
177 MEMORY_AREA
* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace
,
179 NTSTATUS
MmInitMemoryAreas(VOID
);
180 VOID
ExInitNonPagedPool(ULONG BaseAddress
);
181 NTSTATUS
MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace
,
184 VOID (*FreePage
)(PVOID Context
, MEMORY_AREA
* MemoryArea
,
185 PVOID Address
, PHYSICAL_ADDRESS PhysAddr
, SWAPENTRY SwapEntry
,
187 PVOID FreePageContext
);
188 VOID
MmDumpMemoryAreas(PLIST_ENTRY ListHead
);
189 NTSTATUS
MmLockMemoryArea(MEMORY_AREA
* MemoryArea
);
190 NTSTATUS
MmUnlockMemoryArea(MEMORY_AREA
* MemoryArea
);
191 NTSTATUS
MmInitSectionImplementation(VOID
);
193 #define MM_LOWEST_USER_ADDRESS (4096)
195 PMEMORY_AREA
MmSplitMemoryArea(struct _EPROCESS
* Process
,
196 PMADDRESS_SPACE AddressSpace
,
197 PMEMORY_AREA OriginalMemoryArea
,
201 ULONG NewAttributes
);
203 MmInitializePageList(PVOID FirstPhysKernelAddress
,
204 PVOID LastPhysKernelAddress
,
205 ULONG MemorySizeInPages
,
206 ULONG LastKernelBase
,
207 PADDRESS_RANGE BIOSMemoryMap
,
208 ULONG AddressRangeCount
);
210 MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
211 VOID
MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress
);
212 VOID
MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress
);
213 VOID
MmDeletePageTable(struct _EPROCESS
* Process
,
215 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
,
216 struct _EPROCESS
* Dest
);
217 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
218 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
220 MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
224 PHYSICAL_ADDRESS
* PhysicalPage
);
226 #define MM_PAGE_CLEAN (0)
227 #define MM_PAGE_DIRTY (1)
229 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
230 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
231 VOID
MiShutdownMemoryManager(VOID
);
233 MmGetPhysicalAddressForProcess(struct _EPROCESS
* Process
,
236 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
237 VOID
MmInitPagingFile(VOID
);
239 /* FIXME: it should be in ddk/mmfuncs.h */
243 OUT PSECTION_OBJECT
* SectionObject
,
244 IN ACCESS_MASK DesiredAccess
,
245 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
246 IN PLARGE_INTEGER MaximumSize
,
247 IN ULONG SectionPageProtection
,
248 IN ULONG AllocationAttributes
,
249 IN HANDLE FileHandle OPTIONAL
,
250 IN PFILE_OBJECT File OPTIONAL
253 NTSTATUS
MmPageFault(ULONG Cs
,
260 MmAccessFault(KPROCESSOR_MODE Mode
,
264 MmNotPresentFault(KPROCESSOR_MODE Mode
,
268 MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
269 MEMORY_AREA
* MemoryArea
,
273 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
274 MEMORY_AREA
* MemoryArea
,
277 NTSTATUS
MmWaitForPage(PVOID Page
);
278 VOID
MmClearWaitPage(PVOID Page
);
279 VOID
MmSetWaitPage(PVOID Page
);
280 BOOLEAN
MmIsPageDirty(struct _EPROCESS
* Process
, PVOID Address
);
281 BOOLEAN
MmIsPageTablePresent(PVOID PAddress
);
283 MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
284 PMEMORY_AREA MemoryArea
,
286 struct _MM_PAGEOP
* PageOp
);
288 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
289 PMEMORY_AREA MemoryArea
,
291 struct _MM_PAGEOP
* PageOp
);
292 MEMORY_AREA
* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace
,
296 VOID
ExUnmapPage(PVOID Addr
);
297 PVOID
ExAllocatePage(VOID
);
299 VOID
MmInitPagingFile(VOID
);
300 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
301 VOID
MmDereserveSwapPages(ULONG Nr
);
302 SWAPENTRY
MmAllocSwapPage(VOID
);
303 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
305 VOID
MmInit1(ULONG FirstKernelPhysAddress
,
306 ULONG LastKernelPhysAddress
,
307 ULONG LastKernelAddress
,
308 PADDRESS_RANGE BIOSMemoryMap
,
309 ULONG AddressRangeCount
);
312 NTSTATUS
MmInitPagerThread(VOID
);
314 VOID
MmInitKernelMap(PVOID BaseAddress
);
315 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
321 ULONG NrReservedPages
;
326 ULONG PagingRequestsInLastMinute
;
327 ULONG PagingRequestsInLastFiveMinutes
;
328 ULONG PagingRequestsInLastFifteenMinutes
;
331 extern MM_STATS MmStats
;
334 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
338 MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
342 MmGetDirtyPagesFromWorkingSet(struct _EPROCESS
* Process
);
344 MmWriteToSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
346 MmReadFromSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
348 MmSetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress
, ULONG Flags
);
350 MmGetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress
);
351 VOID
MmSetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress
,
352 SWAPENTRY SavedSwapEntry
);
353 SWAPENTRY
MmGetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress
);
354 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
355 VOID
MmLockPage(PHYSICAL_ADDRESS PhysicalPage
);
356 VOID
MmUnlockPage(PHYSICAL_ADDRESS PhysicalPage
);
358 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, PVOID Src
, ULONG Count
);
359 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, PVOID Src
, ULONG Count
);
361 MmCreatePhysicalMemorySection(VOID
);
363 MmGetContinuousPages(ULONG NumberOfBytes
,
364 PHYSICAL_ADDRESS HighestAcceptableAddress
,
367 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
370 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
371 MEMORY_AREA
* MemoryArea
,
375 MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
377 ExAllocatePageWithPhysPage(PHYSICAL_ADDRESS PhysPage
);
379 MmGetReferenceCountPage(PHYSICAL_ADDRESS PhysicalAddress
);
381 MmIsUsablePage(PHYSICAL_ADDRESS PhysicalAddress
);
383 #define MM_PAGEOP_PAGEIN (1)
384 #define MM_PAGEOP_PAGEOUT (2)
385 #define MM_PAGEOP_PAGESYNCH (3)
386 #define MM_PAGEOP_ACCESSFAULT (4)
388 typedef struct _MM_PAGEOP
390 /* Type of operation. */
392 /* Number of threads interested in this operation. */
393 ULONG ReferenceCount
;
394 /* Event that will be set when the operation is completed. */
395 KEVENT CompletionEvent
;
396 /* Status of the operation once it is completed. */
398 /* TRUE if the operation was abandoned. */
400 /* The memory area to be affected by the operation. */
403 struct _MM_PAGEOP
* Next
;
404 struct _ETHREAD
* Thread
;
406 * These fields are used to identify the operation if it is against a
407 * virtual memory area.
412 * These fields are used to identify the operation if it is against a
415 PMM_SECTION_SEGMENT Segment
;
417 } MM_PAGEOP
, *PMM_PAGEOP
;
420 MmReleasePageOp(PMM_PAGEOP PageOp
);
423 MmGetPageOp(PMEMORY_AREA MArea
, ULONG Pid
, PVOID Address
,
424 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
);
427 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
429 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
431 MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress
);
433 MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress
);
435 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
437 typedef struct _MM_IMAGE_SECTION_OBJECT
440 MM_SECTION_SEGMENT Segments
[0];
441 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
444 MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
446 MiCopyFromUserPage(PHYSICAL_ADDRESS DestPhysPage
, PVOID SourceAddress
);
448 MiZeroPage(PHYSICAL_ADDRESS PhysPage
);
450 MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
452 #define STATUS_MM_RESTART_OPERATION (0xD0000001)
455 MmCreateVirtualMappingForKernel(PVOID Address
,
457 PHYSICAL_ADDRESS PhysicalAddress
);
458 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
);
459 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
462 PHYSICAL_ADDRESS PhysicalAddress
,
465 MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
468 PHYSICAL_ADDRESS PhysicalAddress
,
471 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
474 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
477 /* Memory balancing. */
479 MmInitializeMemoryConsumer(ULONG Consumer
,
480 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
,
483 MmInitializeBalancer(ULONG NrAvailablePages
);
485 MmReleasePageMemoryConsumer(ULONG Consumer
, PHYSICAL_ADDRESS Page
);
487 MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN CanWait
,
488 PHYSICAL_ADDRESS
* AllocatedPage
);
493 #define MC_NPPOOL (3)
494 #define MC_MAXIMUM (4)
497 MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress
,
498 struct _MM_RMAP_ENTRY
* ListHead
);
499 struct _MM_RMAP_ENTRY
*
500 MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress
);
502 MmInsertRmap(PHYSICAL_ADDRESS PhysicalAddress
, PEPROCESS Process
,
505 MmDeleteAllRmaps(PHYSICAL_ADDRESS PhysicalAddress
, PVOID Context
,
506 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
508 MmDeleteRmap(PHYSICAL_ADDRESS PhysicalAddress
, PEPROCESS Process
,
511 MmInitializeRmapList(VOID
);
513 MmGetLRUNextUserPage(PHYSICAL_ADDRESS PreviousPhysicalAddress
);
515 MmGetLRUFirstUserPage(VOID
);
517 MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress
);
519 MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
522 MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, ULONG
* PhysicalAddr
);
523 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
525 MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
,
526 SWAPENTRY
* SwapEntry
);
528 MmCreatePageFileMapping(PEPROCESS Process
,
530 SWAPENTRY SwapEntry
);
531 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
533 MmTransferOwnershipPage(PHYSICAL_ADDRESS PhysicalAddress
, ULONG NewConsumer
);
534 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
536 MmInitializeMdlImplementation(VOID
);
537 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
539 MmCheckForPageOp(PMEMORY_AREA MArea
, ULONG Pid
, PVOID Address
,
540 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
543 MmDumpToPagingFile(ULONG BugCode
,
544 ULONG BugCodeParameter1
,
545 ULONG BugCodeParameter2
,
546 ULONG BugCodeParameter3
,
547 ULONG BugCodeParameter4
,
548 struct _KTRAP_FRAME
* TrapFrame
);