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
,
27 MEMORY_AREA_SECTION_VIEW_RESERVE
,
28 MEMORY_AREA_CACHE_SEGMENT
,
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
;
87 } MEMORY_AREA
, *PMEMORY_AREA
;
89 #define WSET_ADDRESSES_IN_PAGE (1020)
91 typedef struct _MWORKING_SET
93 PVOID Address
[WSET_ADDRESSES_IN_PAGE
];
94 struct _MWORKING_SET
* Next
;
95 } MWORKING_SET
, *PMWORKING_SET
;
97 typedef struct _MADDRESS_SPACE
99 LIST_ENTRY MAreaListHead
;
102 struct _EPROCESS
* Process
;
103 ULONG WorkingSetSize
;
104 ULONG WorkingSetLruFirst
;
105 ULONG WorkingSetLruLast
;
106 ULONG WorkingSetPagesAllocated
;
107 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
111 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
112 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
113 VOID
MmInitializeKernelAddressSpace(VOID
);
114 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
115 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
116 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
117 PMADDRESS_SPACE AddressSpace
);
118 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
119 PVOID STDCALL
MmAllocateSection (IN ULONG Length
);
120 NTSTATUS
MmCreateMemoryArea(struct _EPROCESS
* Process
,
121 PMADDRESS_SPACE AddressSpace
,
126 MEMORY_AREA
** Result
);
127 MEMORY_AREA
* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace
,
129 NTSTATUS
MmInitMemoryAreas(VOID
);
130 VOID
ExInitNonPagedPool(ULONG BaseAddress
);
131 NTSTATUS
MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace
,
135 VOID
MmDumpMemoryAreas(PLIST_ENTRY ListHead
);
136 NTSTATUS
MmLockMemoryArea(MEMORY_AREA
* MemoryArea
);
137 NTSTATUS
MmUnlockMemoryArea(MEMORY_AREA
* MemoryArea
);
138 NTSTATUS
MmInitSectionImplementation(VOID
);
140 #define MM_LOWEST_USER_ADDRESS (4096)
142 PMEMORY_AREA
MmSplitMemoryArea(struct _EPROCESS
* Process
,
143 PMADDRESS_SPACE AddressSpace
,
144 PMEMORY_AREA OriginalMemoryArea
,
148 ULONG NewAttributes
);
149 PVOID
MmInitializePageList(PVOID FirstPhysKernelAddress
,
150 PVOID LastPhysKernelAddress
,
151 ULONG MemorySizeInPages
,
152 ULONG LastKernelBase
);
154 PVOID
MmAllocPage(SWAPENTRY SavedSwapEntry
);
155 VOID
MmDereferencePage(PVOID PhysicalAddress
);
156 VOID
MmReferencePage(PVOID PhysicalAddress
);
157 VOID
MmDeletePageTable(struct _EPROCESS
* Process
,
159 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
,
160 struct _EPROCESS
* Dest
);
161 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
162 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
163 VOID
MmDeletePageEntry(struct _EPROCESS
* Process
,
167 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
168 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
169 VOID
MiShutdownMemoryManager(VOID
);
170 ULONG
MmGetPhysicalAddressForProcess(struct _EPROCESS
* Process
,
172 NTSTATUS STDCALL
MmUnmapViewOfSection(struct _EPROCESS
* Process
,
173 PMEMORY_AREA MemoryArea
);
174 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, PVOID Src
, ULONG NumberOfBytes
);
175 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, PVOID Src
, ULONG NumberOfBytes
);
176 VOID
MmInitPagingFile(VOID
);
178 /* FIXME: it should be in ddk/mmfuncs.h */
182 OUT PSECTION_OBJECT
* SectionObject
,
183 IN ACCESS_MASK DesiredAccess
,
184 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
185 IN PLARGE_INTEGER MaximumSize
,
186 IN ULONG SectionPageProtection
,
187 IN ULONG AllocationAttributes
,
188 IN HANDLE FileHandle OPTIONAL
,
189 IN PFILE_OBJECT File OPTIONAL
192 NTSTATUS
MmPageFault(ULONG Cs
,
198 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
200 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
202 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
203 MEMORY_AREA
* MemoryArea
,
205 NTSTATUS
MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
206 MEMORY_AREA
* MemoryArea
,
208 NTSTATUS
MmWaitForPage(PVOID Page
);
209 VOID
MmClearWaitPage(PVOID Page
);
210 VOID
MmSetWaitPage(PVOID Page
);
211 BOOLEAN
MmIsPageDirty(struct _EPROCESS
* Process
, PVOID Address
);
212 BOOLEAN
MmIsPageTablePresent(PVOID PAddress
);
213 ULONG
MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
214 MEMORY_AREA
* MemoryArea
,
217 ULONG
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
218 PMEMORY_AREA MemoryArea
,
221 MEMORY_AREA
* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace
,
225 VOID
ExUnmapPage(PVOID Addr
);
226 PVOID
ExAllocatePage(VOID
);
228 VOID
MmLockWorkingSet(struct _EPROCESS
* Process
);
229 VOID
MmUnlockWorkingSet(struct _EPROCESS
* Process
);
230 VOID
MmInitializeWorkingSet(struct _EPROCESS
* Process
,
231 PMADDRESS_SPACE AddressSpace
);
232 ULONG
MmTrimWorkingSet(struct _EPROCESS
* Process
,
234 VOID
MmRemovePageFromWorkingSet(struct _EPROCESS
* Process
,
236 BOOLEAN
MmAddPageToWorkingSet(struct _EPROCESS
* Process
,
239 VOID
MmInitPagingFile(VOID
);
240 VOID
MmReserveSwapPages(ULONG Nr
);
241 VOID
MmDereserveSwapPages(ULONG Nr
);
242 SWAPENTRY
MmAllocSwapPage(VOID
);
243 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
245 VOID
MmInit1(PLOADER_PARAMETER_BLOCK bp
, ULONG LastKernelAddress
);
248 NTSTATUS
MmInitPagerThread(VOID
);
250 VOID
MmInitKernelMap(PVOID BaseAddress
);
251 unsigned int alloc_pool_region(unsigned int nr_pages
);
253 VOID
MmWaitForFreePages(VOID
);
254 PVOID
MmMustAllocPage(SWAPENTRY SavedSwapEntry
);
255 PVOID
MmAllocPageMaybeSwap(SWAPENTRY SavedSwapEntry
);
256 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
262 ULONG NrReservedPages
;
267 ULONG PagingRequestsInLastMinute
;
268 ULONG PagingRequestsInLastFiveMinutes
;
269 ULONG PagingRequestsInLastFifteenMinutes
;
272 extern MM_STATS MmStats
;
274 NTSTATUS
MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
277 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
280 PVOID
MmGetDirtyPagesFromWorkingSet(struct _EPROCESS
* Process
);
281 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
282 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PMDL Mdl
);
283 VOID
MmSetFlagsPage(PVOID PhysicalAddress
, ULONG Flags
);
284 ULONG
MmGetFlagsPage(PVOID PhysicalAddress
);
285 VOID
MmSetSavedSwapEntryPage(PVOID PhysicalAddress
,
286 SWAPENTRY SavedSwapEntry
);
287 SWAPENTRY
MmGetSavedSwapEntryPage(PVOID PhysicalAddress
);
288 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
289 VOID
MmLockPage(PVOID PhysicalPage
);
290 VOID
MmUnlockPage(PVOID PhysicalPage
);
292 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)