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/mmhal.h>
11 /* TYPES *********************************************************************/
14 typedef ULONG SWAPENTRY
;
19 MEMORY_AREA_SECTION_VIEW_COMMIT
,
20 MEMORY_AREA_CONTINUOUS_MEMORY
,
22 MEMORY_AREA_IO_MAPPING
,
24 MEMORY_AREA_MDL_MAPPING
,
25 MEMORY_AREA_VIRTUAL_MEMORY
,
26 MEMORY_AREA_SECTION_VIEW_RESERVE
,
27 MEMORY_AREA_CACHE_SEGMENT
,
28 MEMORY_AREA_SHARED_DATA
,
31 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
33 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
34 ((((x)) % (4*1024*1024)) / (4*1024))
36 #define NR_SECTION_PAGE_TABLES (1024)
37 #define NR_SECTION_PAGE_ENTRIES (1024)
39 #define SPE_PAGEIN_PENDING (0x1)
40 #define SPE_MPW_PENDING (0x2)
41 #define SPE_PAGEOUT_PENDING (0x4)
42 #define SPE_DIRTY (0x8)
43 #define SPE_IN_PAGEFILE (0x10)
47 ULONG Pages
[NR_SECTION_PAGE_ENTRIES
];
48 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
52 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
53 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
59 LARGE_INTEGER MaximumSize
;
60 ULONG SectionPageProtection
;
61 ULONG AllocateAttributes
;
62 PFILE_OBJECT FileObject
;
63 LIST_ENTRY ViewListHead
;
64 KSPIN_LOCK ViewListLock
;
66 SECTION_PAGE_DIRECTORY PageDirectory
;
67 } SECTION_OBJECT
, *PSECTION_OBJECT
;
77 struct _EPROCESS
* Process
;
82 SECTION_OBJECT
* Section
;
84 LIST_ENTRY ViewListEntry
;
88 LIST_ENTRY SegmentListHead
;
91 } MEMORY_AREA
, *PMEMORY_AREA
;
93 #define WSET_ADDRESSES_IN_PAGE (1020)
95 typedef struct _MWORKING_SET
97 PVOID Address
[WSET_ADDRESSES_IN_PAGE
];
98 struct _MWORKING_SET
* Next
;
99 } MWORKING_SET
, *PMWORKING_SET
;
101 typedef struct _MADDRESS_SPACE
103 LIST_ENTRY MAreaListHead
;
106 struct _EPROCESS
* Process
;
107 ULONG WorkingSetSize
;
108 ULONG WorkingSetLruFirst
;
109 ULONG WorkingSetLruLast
;
110 ULONG WorkingSetPagesAllocated
;
111 PUSHORT PageTableRefCountTable
;
112 ULONG PageTableRefCountTableSize
;
113 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
117 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
118 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
119 VOID
MmInitializeKernelAddressSpace(VOID
);
120 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
121 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
122 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
123 PMADDRESS_SPACE AddressSpace
);
124 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
125 PVOID STDCALL
MmAllocateSection (IN ULONG Length
);
126 NTSTATUS
MmCreateMemoryArea(struct _EPROCESS
* Process
,
127 PMADDRESS_SPACE AddressSpace
,
132 MEMORY_AREA
** Result
);
133 MEMORY_AREA
* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace
,
135 NTSTATUS
MmInitMemoryAreas(VOID
);
136 VOID
ExInitNonPagedPool(ULONG BaseAddress
);
137 NTSTATUS
MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace
,
141 VOID
MmDumpMemoryAreas(PLIST_ENTRY ListHead
);
142 NTSTATUS
MmLockMemoryArea(MEMORY_AREA
* MemoryArea
);
143 NTSTATUS
MmUnlockMemoryArea(MEMORY_AREA
* MemoryArea
);
144 NTSTATUS
MmInitSectionImplementation(VOID
);
146 #define MM_LOWEST_USER_ADDRESS (4096)
148 PMEMORY_AREA
MmSplitMemoryArea(struct _EPROCESS
* Process
,
149 PMADDRESS_SPACE AddressSpace
,
150 PMEMORY_AREA OriginalMemoryArea
,
154 ULONG NewAttributes
);
155 PVOID
MmInitializePageList(PVOID FirstPhysKernelAddress
,
156 PVOID LastPhysKernelAddress
,
157 ULONG MemorySizeInPages
,
158 ULONG LastKernelBase
);
160 PVOID
MmAllocPage(SWAPENTRY SavedSwapEntry
);
161 VOID
MmDereferencePage(PVOID PhysicalAddress
);
162 VOID
MmReferencePage(PVOID PhysicalAddress
);
163 VOID
MmDeletePageTable(struct _EPROCESS
* Process
,
165 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
,
166 struct _EPROCESS
* Dest
);
167 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
168 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
169 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
173 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
174 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
175 VOID
MiShutdownMemoryManager(VOID
);
176 ULONG
MmGetPhysicalAddressForProcess(struct _EPROCESS
* Process
,
178 NTSTATUS STDCALL
MmUnmapViewOfSection(struct _EPROCESS
* Process
,
179 PMEMORY_AREA MemoryArea
);
180 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, PVOID Src
, ULONG NumberOfBytes
);
181 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, PVOID Src
, ULONG NumberOfBytes
);
182 VOID
MmInitPagingFile(VOID
);
184 /* FIXME: it should be in ddk/mmfuncs.h */
188 OUT PSECTION_OBJECT
* SectionObject
,
189 IN ACCESS_MASK DesiredAccess
,
190 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
191 IN PLARGE_INTEGER MaximumSize
,
192 IN ULONG SectionPageProtection
,
193 IN ULONG AllocationAttributes
,
194 IN HANDLE FileHandle OPTIONAL
,
195 IN PFILE_OBJECT File OPTIONAL
198 NTSTATUS
MmPageFault(ULONG Cs
,
204 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
206 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
208 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
209 MEMORY_AREA
* MemoryArea
,
211 NTSTATUS
MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
212 MEMORY_AREA
* MemoryArea
,
214 NTSTATUS
MmWaitForPage(PVOID Page
);
215 VOID
MmClearWaitPage(PVOID Page
);
216 VOID
MmSetWaitPage(PVOID Page
);
217 BOOLEAN
MmIsPageDirty(struct _EPROCESS
* Process
, PVOID Address
);
218 BOOLEAN
MmIsPageTablePresent(PVOID PAddress
);
219 ULONG
MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
220 MEMORY_AREA
* MemoryArea
,
223 ULONG
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
224 PMEMORY_AREA MemoryArea
,
227 MEMORY_AREA
* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace
,
231 VOID
ExUnmapPage(PVOID Addr
);
232 PVOID
ExAllocatePage(VOID
);
234 VOID
MmLockWorkingSet(struct _EPROCESS
* Process
);
235 VOID
MmUnlockWorkingSet(struct _EPROCESS
* Process
);
236 VOID
MmInitializeWorkingSet(struct _EPROCESS
* Process
,
237 PMADDRESS_SPACE AddressSpace
);
238 ULONG
MmTrimWorkingSet(struct _EPROCESS
* Process
,
240 VOID
MmRemovePageFromWorkingSet(struct _EPROCESS
* Process
,
242 BOOLEAN
MmAddPageToWorkingSet(struct _EPROCESS
* Process
,
245 VOID
MmInitPagingFile(VOID
);
246 VOID
MmReserveSwapPages(ULONG Nr
);
247 VOID
MmDereserveSwapPages(ULONG Nr
);
248 SWAPENTRY
MmAllocSwapPage(VOID
);
249 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
251 VOID
MmInit1(PLOADER_PARAMETER_BLOCK bp
, ULONG LastKernelAddress
);
254 NTSTATUS
MmInitPagerThread(VOID
);
256 VOID
MmInitKernelMap(PVOID BaseAddress
);
257 unsigned int alloc_pool_region(unsigned int nr_pages
);
259 VOID
MmWaitForFreePages(VOID
);
260 PVOID
MmMustAllocPage(SWAPENTRY SavedSwapEntry
);
261 PVOID
MmAllocPageMaybeSwap(SWAPENTRY SavedSwapEntry
);
262 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
268 ULONG NrReservedPages
;
273 ULONG PagingRequestsInLastMinute
;
274 ULONG PagingRequestsInLastFiveMinutes
;
275 ULONG PagingRequestsInLastFifteenMinutes
;
278 extern MM_STATS MmStats
;
280 NTSTATUS
MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
283 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
286 PVOID
MmGetDirtyPagesFromWorkingSet(struct _EPROCESS
* Process
);
287 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
288 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
289 VOID
MmSetFlagsPage(PVOID PhysicalAddress
, ULONG Flags
);
290 ULONG
MmGetFlagsPage(PVOID PhysicalAddress
);
291 VOID
MmSetSavedSwapEntryPage(PVOID PhysicalAddress
,
292 SWAPENTRY SavedSwapEntry
);
293 SWAPENTRY
MmGetSavedSwapEntryPage(PVOID PhysicalAddress
);
294 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
295 VOID
MmLockPage(PVOID PhysicalPage
);
296 VOID
MmUnlockPage(PVOID PhysicalPage
);
298 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)