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 (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_CACHE_SEGMENT (9)
28 #define MEMORY_AREA_SHARED_DATA (10)
29 #define MEMORY_AREA_KERNEL_STACK (11)
30 #define MEMORY_AREA_PAGED_POOL (12)
31 #define MEMORY_AREA_NO_ACCESS (13)
33 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
35 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
36 ((((x)) % (4*1024*1024)) / (4*1024))
38 #define NR_SECTION_PAGE_TABLES (1024)
39 #define NR_SECTION_PAGE_ENTRIES (1024)
43 * Additional flags for protection attributes
45 #define PAGE_WRITETHROUGH (1024)
46 #define PAGE_SYSTEM (2048)
47 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
52 PAGE_EXECUTE_READWRITE | \
53 PAGE_EXECUTE_WRITECOPY | \
60 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
61 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
65 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
66 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
68 #define SEC_PHYSICALMEMORY (0x80000000)
70 #define MM_PAGEFILE_SEGMENT (0x1)
71 #define MM_DATAFILE_SEGMENT (0x2)
73 #define MM_SECTION_SEGMENT_BSS (0x1)
75 typedef struct _MM_SECTION_SEGMENT
84 SECTION_PAGE_DIRECTORY PageDirectory
;
87 ULONG Characteristics
;
89 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
91 typedef struct _SECTION_OBJECT
95 LARGE_INTEGER MaximumSize
;
96 ULONG SectionPageProtection
;
97 ULONG AllocationAttributes
;
98 PFILE_OBJECT FileObject
;
99 LIST_ENTRY ViewListHead
;
100 KSPIN_LOCK ViewListLock
;
103 PMM_SECTION_SEGMENT Segments
;
109 ULONG MinorSubsystemVersion
;
110 ULONG MajorSubsystemVersion
;
111 ULONG ImageCharacteristics
;
118 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
120 #endif /* __USE_W32API */
130 struct _EPROCESS
* Process
;
131 BOOLEAN DeleteInProgress
;
137 SECTION_OBJECT
* Section
;
139 LIST_ENTRY ViewListEntry
;
140 PMM_SECTION_SEGMENT Segment
;
141 BOOLEAN WriteCopyView
;
142 LIST_ENTRY RegionListHead
;
146 LIST_ENTRY RegionListHead
;
149 } MEMORY_AREA
, *PMEMORY_AREA
;
151 typedef struct _MADDRESS_SPACE
153 LIST_ENTRY MAreaListHead
;
156 struct _EPROCESS
* Process
;
157 PUSHORT PageTableRefCountTable
;
158 ULONG PageTableRefCountTableSize
;
159 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
165 extern PVOID MmSystemRangeStart
;
167 #endif /* __USE_W32API */
172 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
173 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
174 VOID
MmInitializeKernelAddressSpace(VOID
);
175 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
176 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
177 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
178 PMADDRESS_SPACE AddressSpace
);
179 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
180 PVOID STDCALL
MmAllocateSection (IN ULONG Length
);
181 NTSTATUS
MmCreateMemoryArea(struct _EPROCESS
* Process
,
182 PMADDRESS_SPACE AddressSpace
,
187 MEMORY_AREA
** Result
,
190 MEMORY_AREA
* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace
,
192 NTSTATUS
MmInitMemoryAreas(VOID
);
193 VOID
ExInitNonPagedPool(ULONG BaseAddress
);
194 NTSTATUS
MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace
,
197 VOID (*FreePage
)(PVOID Context
, MEMORY_AREA
* MemoryArea
,
198 PVOID Address
, PHYSICAL_ADDRESS PhysAddr
, SWAPENTRY SwapEntry
,
200 PVOID FreePageContext
);
201 VOID
MmDumpMemoryAreas(PLIST_ENTRY ListHead
);
202 NTSTATUS
MmLockMemoryArea(MEMORY_AREA
* MemoryArea
);
203 NTSTATUS
MmUnlockMemoryArea(MEMORY_AREA
* MemoryArea
);
204 NTSTATUS
MmInitSectionImplementation(VOID
);
206 #define MM_LOWEST_USER_ADDRESS (4096)
208 PMEMORY_AREA
MmSplitMemoryArea(struct _EPROCESS
* Process
,
209 PMADDRESS_SPACE AddressSpace
,
210 PMEMORY_AREA OriginalMemoryArea
,
214 ULONG NewAttributes
);
216 MmInitializePageList(PVOID FirstPhysKernelAddress
,
217 PVOID LastPhysKernelAddress
,
218 ULONG MemorySizeInPages
,
219 ULONG LastKernelBase
,
220 PADDRESS_RANGE BIOSMemoryMap
,
221 ULONG AddressRangeCount
);
223 MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
224 VOID
MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress
);
225 VOID
MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress
);
226 VOID
MmDeletePageTable(struct _EPROCESS
* Process
,
228 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
,
229 struct _EPROCESS
* Dest
);
230 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
231 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
233 MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
237 PHYSICAL_ADDRESS
* PhysicalPage
,
238 BOOL MarkPageUnmapped
);
239 VOID
MmUpdateStackPageDir(PULONG LocalPageDir
, struct _KTHREAD
* KThread
);
241 #define MM_PAGE_CLEAN (0)
242 #define MM_PAGE_DIRTY (1)
244 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
245 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
246 VOID
MiShutdownMemoryManager(VOID
);
248 MmGetPhysicalAddressForProcess(struct _EPROCESS
* Process
,
251 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
252 VOID
MmInitPagingFile(VOID
);
254 /* FIXME: it should be in ddk/mmfuncs.h */
258 OUT PSECTION_OBJECT
* SectionObject
,
259 IN ACCESS_MASK DesiredAccess
,
260 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
261 IN PLARGE_INTEGER MaximumSize
,
262 IN ULONG SectionPageProtection
,
263 IN ULONG AllocationAttributes
,
264 IN HANDLE FileHandle OPTIONAL
,
265 IN PFILE_OBJECT File OPTIONAL
268 NTSTATUS
MmPageFault(ULONG Cs
,
275 MmAccessFault(KPROCESSOR_MODE Mode
,
279 MmNotPresentFault(KPROCESSOR_MODE Mode
,
283 MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
284 MEMORY_AREA
* MemoryArea
,
288 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
289 MEMORY_AREA
* MemoryArea
,
292 NTSTATUS
MmWaitForPage(PVOID Page
);
293 VOID
MmClearWaitPage(PVOID Page
);
294 VOID
MmSetWaitPage(PVOID Page
);
295 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
296 BOOLEAN
MmIsPageTablePresent(PVOID PAddress
);
298 MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
299 PMEMORY_AREA MemoryArea
,
301 struct _MM_PAGEOP
* PageOp
);
303 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
304 PMEMORY_AREA MemoryArea
,
306 struct _MM_PAGEOP
* PageOp
);
307 MEMORY_AREA
* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace
,
310 PVOID
MmFindGap(PMADDRESS_SPACE AddressSpace
, ULONG Length
, BOOL TopDown
);
311 VOID
ExUnmapPage(PVOID Addr
);
312 PVOID
ExAllocatePage(VOID
);
314 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
315 VOID
MmDereserveSwapPages(ULONG Nr
);
316 SWAPENTRY
MmAllocSwapPage(VOID
);
317 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
319 VOID
MmInit1(ULONG FirstKernelPhysAddress
,
320 ULONG LastKernelPhysAddress
,
321 ULONG LastKernelAddress
,
322 PADDRESS_RANGE BIOSMemoryMap
,
323 ULONG AddressRangeCount
,
327 NTSTATUS
MmInitPagerThread(VOID
);
329 VOID
MmInitKernelMap(PVOID BaseAddress
);
330 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
336 ULONG NrReservedPages
;
341 ULONG PagingRequestsInLastMinute
;
342 ULONG PagingRequestsInLastFiveMinutes
;
343 ULONG PagingRequestsInLastFifteenMinutes
;
346 extern MM_STATS MmStats
;
349 MmGetDirtyPagesFromWorkingSet(struct _EPROCESS
* Process
);
351 MmWriteToSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
353 MmReadFromSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
355 MmSetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress
, ULONG Flags
);
357 MmGetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress
);
358 VOID
MmSetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress
,
359 SWAPENTRY SavedSwapEntry
);
360 SWAPENTRY
MmGetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress
);
361 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
362 VOID
MmLockPage(PHYSICAL_ADDRESS PhysicalPage
);
363 VOID
MmUnlockPage(PHYSICAL_ADDRESS PhysicalPage
);
365 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, PVOID Src
, ULONG Count
);
366 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, PVOID Src
, ULONG Count
);
368 MmCreatePhysicalMemorySection(VOID
);
370 MmGetContinuousPages(ULONG NumberOfBytes
,
371 PHYSICAL_ADDRESS HighestAcceptableAddress
,
374 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
377 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
378 MEMORY_AREA
* MemoryArea
,
382 MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
384 ExAllocatePageWithPhysPage(PHYSICAL_ADDRESS PhysPage
);
386 MmGetReferenceCountPage(PHYSICAL_ADDRESS PhysicalAddress
);
388 MmIsUsablePage(PHYSICAL_ADDRESS PhysicalAddress
);
390 #define MM_PAGEOP_PAGEIN (1)
391 #define MM_PAGEOP_PAGEOUT (2)
392 #define MM_PAGEOP_PAGESYNCH (3)
393 #define MM_PAGEOP_ACCESSFAULT (4)
395 typedef struct _MM_PAGEOP
397 /* Type of operation. */
399 /* Number of threads interested in this operation. */
400 ULONG ReferenceCount
;
401 /* Event that will be set when the operation is completed. */
402 KEVENT CompletionEvent
;
403 /* Status of the operation once it is completed. */
405 /* TRUE if the operation was abandoned. */
407 /* The memory area to be affected by the operation. */
410 struct _MM_PAGEOP
* Next
;
411 struct _ETHREAD
* Thread
;
413 * These fields are used to identify the operation if it is against a
414 * virtual memory area.
419 * These fields are used to identify the operation if it is against a
422 PMM_SECTION_SEGMENT Segment
;
424 } MM_PAGEOP
, *PMM_PAGEOP
;
427 MmReleasePageOp(PMM_PAGEOP PageOp
);
430 MmGetPageOp(PMEMORY_AREA MArea
, ULONG Pid
, PVOID Address
,
431 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
);
433 MmCheckForPageOp(PMEMORY_AREA MArea
, ULONG Pid
, PVOID Address
,
434 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
436 MmInitializePageOp(VOID
);
438 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
440 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
442 MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress
);
444 MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress
);
446 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
448 typedef struct _MM_IMAGE_SECTION_OBJECT
451 MM_SECTION_SEGMENT Segments
[0];
452 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
455 MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
457 MiCopyFromUserPage(PHYSICAL_ADDRESS DestPhysPage
, PVOID SourceAddress
);
459 MiZeroPage(PHYSICAL_ADDRESS PhysPage
);
461 MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
463 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
466 MmCreateVirtualMappingForKernel(PVOID Address
,
468 PHYSICAL_ADDRESS PhysicalAddress
);
469 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
);
470 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
473 PHYSICAL_ADDRESS PhysicalAddress
,
476 MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
479 PHYSICAL_ADDRESS PhysicalAddress
,
482 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
485 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
488 VOID
MmInitGlobalKernelPageDirectory(VOID
);
490 /* Memory balancing. */
492 MmInitializeMemoryConsumer(ULONG Consumer
,
493 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
,
496 MmInitializeBalancer(ULONG NrAvailablePages
);
498 MmReleasePageMemoryConsumer(ULONG Consumer
, PHYSICAL_ADDRESS Page
);
500 MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN CanWait
,
501 PHYSICAL_ADDRESS
* AllocatedPage
);
506 #define MC_NPPOOL (3)
507 #define MC_MAXIMUM (4)
510 MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress
,
511 struct _MM_RMAP_ENTRY
* ListHead
);
512 struct _MM_RMAP_ENTRY
*
513 MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress
);
515 MmInsertRmap(PHYSICAL_ADDRESS PhysicalAddress
, PEPROCESS Process
,
518 MmDeleteAllRmaps(PHYSICAL_ADDRESS PhysicalAddress
, PVOID Context
,
519 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
521 MmDeleteRmap(PHYSICAL_ADDRESS PhysicalAddress
, PEPROCESS Process
,
524 MmInitializeRmapList(VOID
);
526 MmGetLRUNextUserPage(PHYSICAL_ADDRESS PreviousPhysicalAddress
);
528 MmGetLRUFirstUserPage(VOID
);
530 MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress
);
532 MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
535 MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PHYSICAL_ADDRESS
* PhysicalAddr
);
536 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
538 MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
,
539 SWAPENTRY
* SwapEntry
);
541 MmCreatePageFileMapping(PEPROCESS Process
,
543 SWAPENTRY SwapEntry
);
544 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
546 MmTransferOwnershipPage(PHYSICAL_ADDRESS PhysicalAddress
, ULONG NewConsumer
);
547 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
549 MmInitializeMdlImplementation(VOID
);
550 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
553 MmDumpToPagingFile(ULONG BugCode
,
554 ULONG BugCodeParameter1
,
555 ULONG BugCodeParameter2
,
556 ULONG BugCodeParameter3
,
557 ULONG BugCodeParameter4
,
558 struct _KTRAP_FRAME
* TrapFrame
);
560 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
561 PVOID BaseAddress
, ULONG Length
,
562 ULONG OldType
, ULONG OldProtect
,
563 ULONG NewType
, ULONG NewProtect
);
565 typedef struct _MM_REGION
570 LIST_ENTRY RegionListEntry
;
571 } MM_REGION
, *PMM_REGION
;
574 MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
575 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
576 ULONG NewType
, ULONG NewProtect
,
577 PMM_ALTER_REGION_FUNC AlterFunc
);
579 MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
582 MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
583 PVOID
* RegionBaseAddress
);
585 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
587 PMEMORY_BASIC_INFORMATION Info
,
588 PULONG ResultLength
);
590 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
592 PMEMORY_BASIC_INFORMATION Info
,
593 PULONG ResultLength
);
595 MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
596 PMEMORY_AREA MemoryArea
,
602 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
603 PMEMORY_AREA MemoryArea
,
609 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
614 MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
619 MmSetCleanAllRmaps(PHYSICAL_ADDRESS PhysicalAddress
);
621 MmSetDirtyAllRmaps(PHYSICAL_ADDRESS PhysicalAddress
);
623 MmWritePagePhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress
);
625 MmIsDirtyPageRmap(PHYSICAL_ADDRESS PhysicalAddress
);
626 NTSTATUS
MmInitMpwThread(VOID
);
628 MmIsAvailableSwapPage(VOID
);
630 MmShowOutOfSpaceMessagePagingFile(VOID
);