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 *********************************************************************/
13 extern ULONG MiFreeSwapPages
;
14 extern ULONG MiUsedSwapPages
;
15 extern ULONG MmPagedPoolSize
;
16 extern ULONG MmTotalPagedPoolQuota
;
17 extern ULONG MmTotalNonPagedPoolQuota
;
21 struct _MM_RMAP_ENTRY
;
23 typedef ULONG SWAPENTRY
;
25 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
27 #define MEMORY_AREA_INVALID (0)
28 #define MEMORY_AREA_SECTION_VIEW (1)
29 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
30 #define MEMORY_AREA_NO_CACHE (3)
31 #define MEMORY_AREA_IO_MAPPING (4)
32 #define MEMORY_AREA_SYSTEM (5)
33 #define MEMORY_AREA_MDL_MAPPING (7)
34 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
35 #define MEMORY_AREA_CACHE_SEGMENT (9)
36 #define MEMORY_AREA_SHARED_DATA (10)
37 #define MEMORY_AREA_KERNEL_STACK (11)
38 #define MEMORY_AREA_PAGED_POOL (12)
39 #define MEMORY_AREA_NO_ACCESS (13)
40 #define MEMORY_AREA_PEB_OR_TEB (14)
42 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
44 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
45 ((((x)) % (4*1024*1024)) / (4*1024))
47 #define NR_SECTION_PAGE_TABLES (1024)
48 #define NR_SECTION_PAGE_ENTRIES (1024)
51 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
54 #define MM_VIRTMEM_GRANULARITY (64 * 1024) /* Although Microsoft says this isn't hardcoded anymore,
55 they won't be able to change it. Stuff depends on it */
57 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
60 * Additional flags for protection attributes
62 #define PAGE_WRITETHROUGH (1024)
63 #define PAGE_SYSTEM (2048)
64 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
69 PAGE_EXECUTE_READWRITE | \
70 PAGE_EXECUTE_WRITECOPY | \
75 #define PAGE_IS_READABLE (PAGE_READONLY | \
79 PAGE_EXECUTE_READWRITE | \
80 PAGE_EXECUTE_WRITECOPY)
82 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
84 PAGE_EXECUTE_READWRITE | \
85 PAGE_EXECUTE_WRITECOPY)
87 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
89 PAGE_EXECUTE_READWRITE | \
90 PAGE_EXECUTE_WRITECOPY)
92 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
93 PAGE_EXECUTE_WRITECOPY)
97 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
98 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
102 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
103 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
105 #define SEC_PHYSICALMEMORY (0x80000000)
107 #define MM_PAGEFILE_SEGMENT (0x1)
108 #define MM_DATAFILE_SEGMENT (0x2)
110 typedef struct _MM_SECTION_SEGMENT
113 ULONG_PTR VirtualAddress
;
118 ULONG ReferenceCount
;
119 SECTION_PAGE_DIRECTORY PageDirectory
;
121 ULONG Characteristics
;
123 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
125 typedef struct _MM_IMAGE_SECTION_OBJECT
128 ULONG_PTR StackReserve
;
129 ULONG_PTR StackCommit
;
130 ULONG_PTR EntryPoint
;
132 ULONG ImageCharacteristics
;
133 USHORT MinorSubsystemVersion
;
134 USHORT MajorSubsystemVersion
;
138 PMM_SECTION_SEGMENT Segments
;
139 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
141 typedef struct _SECTION_OBJECT
145 LARGE_INTEGER MaximumSize
;
146 ULONG SectionPageProtection
;
147 ULONG AllocationAttributes
;
148 PFILE_OBJECT FileObject
;
149 LIST_ENTRY ViewListHead
;
150 KSPIN_LOCK ViewListLock
;
153 PMM_IMAGE_SECTION_OBJECT ImageSection
;
154 PMM_SECTION_SEGMENT Segment
;
160 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
162 typedef struct _EPROCESS_QUOTA_ENTRY
{
167 } EPROCESS_QUOTA_ENTRY
, *PEPROCESS_QUOTA_ENTRY
;
169 typedef struct _EPROCESS_QUOTA_BLOCK
{
170 EPROCESS_QUOTA_ENTRY QuotaEntry
[3];
171 LIST_ENTRY QuotaList
;
172 ULONG ReferenceCount
;
174 } EPROCESS_QUOTA_BLOCK
, *PEPROCESS_QUOTA_BLOCK
;
180 typedef struct _PAGEFAULT_HISTORY
186 struct _PROCESS_WS_WATCH_INFORMATION WatchInfo
[1];
187 } PAGEFAULT_HISTORY
, *PPAGEFAULT_HISTORY
;
189 #endif /* __USE_W32API */
191 typedef struct _MMADDRESS_NODE
195 struct _MMADDRESS_NODE
*Parent
;
197 struct _MMADDRESS_NODE
*LeftChild
;
198 struct _MMADDRESS_NODE
*RightChild
;
201 } MMADDRESS_NODE
, *PMMADDRESS_NODE
;
203 typedef struct _MM_AVL_TABLE
205 MMADDRESS_NODE BalancedRoot
;
208 ULONG NumberGenericTableElements
:24;
211 } MM_AVL_TABLE
, *PMM_AVL_TABLE
;
213 typedef struct _MEMORY_AREA
215 PVOID StartingAddress
;
217 struct _MEMORY_AREA
*Parent
;
218 struct _MEMORY_AREA
*LeftChild
;
219 struct _MEMORY_AREA
*RightChild
;
223 struct _EPROCESS
* Process
; /* FIXME: We don't need this! */
224 BOOLEAN DeleteInProgress
;
230 SECTION_OBJECT
* Section
;
232 LIST_ENTRY ViewListEntry
;
233 PMM_SECTION_SEGMENT Segment
;
234 BOOLEAN WriteCopyView
;
235 LIST_ENTRY RegionListHead
;
239 LIST_ENTRY RegionListHead
;
242 } MEMORY_AREA
, *PMEMORY_AREA
;
244 typedef struct _MADDRESS_SPACE
246 PMEMORY_AREA MemoryAreaRoot
;
249 struct _EPROCESS
* Process
;
250 PUSHORT PageTableRefCountTable
;
251 ULONG PageTableRefCountTableSize
;
252 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
254 typedef struct _KNODE
{
257 ULONG MmShiftedColor
;
259 SLIST_HEADER DeadStackList
;
260 SLIST_HEADER PfnDereferenceSListHead
;
261 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
271 extern PVOID EXPORTED MmSystemRangeStart
;
273 extern PVOID IMPORTED MmSystemRangeStart
;
276 #endif /* __USE_W32API */
282 ULONG NrReservedPages
;
287 ULONG PagingRequestsInLastMinute
;
288 ULONG PagingRequestsInLastFiveMinutes
;
289 ULONG PagingRequestsInLastFifteenMinutes
;
292 extern MM_STATS MmStats
;
294 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
296 #define MM_PAGEOP_PAGEIN (1)
297 #define MM_PAGEOP_PAGEOUT (2)
298 #define MM_PAGEOP_PAGESYNCH (3)
299 #define MM_PAGEOP_ACCESSFAULT (4)
301 typedef struct _MM_PAGEOP
303 /* Type of operation. */
305 /* Number of threads interested in this operation. */
306 ULONG ReferenceCount
;
307 /* Event that will be set when the operation is completed. */
308 KEVENT CompletionEvent
;
309 /* Status of the operation once it is completed. */
311 /* TRUE if the operation was abandoned. */
313 /* The memory area to be affected by the operation. */
316 struct _MM_PAGEOP
* Next
;
317 struct _ETHREAD
* Thread
;
319 * These fields are used to identify the operation if it is against a
320 * virtual memory area.
325 * These fields are used to identify the operation if it is against a
328 PMM_SECTION_SEGMENT Segment
;
330 } MM_PAGEOP
, *PMM_PAGEOP
;
335 #define MC_NPPOOL (3)
336 #define MC_MAXIMUM (4)
338 typedef struct _MM_MEMORY_CONSUMER
342 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
344 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
346 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
348 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
351 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
352 PVOID BaseAddress
, ULONG Length
,
353 ULONG OldType
, ULONG OldProtect
,
354 ULONG NewType
, ULONG NewProtect
);
356 typedef struct _MM_REGION
361 LIST_ENTRY RegionListEntry
;
362 } MM_REGION
, *PMM_REGION
;
364 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
365 PVOID Address
, PFN_TYPE Page
,
366 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
370 /* aspace.c ******************************************************************/
372 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
374 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
376 VOID
MmInitializeKernelAddressSpace(VOID
);
378 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
380 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
382 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
383 PMADDRESS_SPACE AddressSpace
);
385 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
387 /* marea.c *******************************************************************/
389 NTSTATUS INIT_FUNCTION
390 MmInitMemoryAreas(VOID
);
394 struct _EPROCESS
* Process
,
395 PMADDRESS_SPACE AddressSpace
,
400 PMEMORY_AREA
*Result
,
401 BOOLEAN FixedAddress
,
403 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
406 MmLocateMemoryAreaByAddress(
407 PMADDRESS_SPACE AddressSpace
,
412 PMADDRESS_SPACE AddressSpace
,
417 PMADDRESS_SPACE AddressSpace
,
418 PMEMORY_AREA MemoryArea
,
419 PMM_FREE_PAGE_FUNC FreePage
,
420 PVOID FreePageContext
);
423 MmFreeMemoryAreaByPtr(
424 PMADDRESS_SPACE AddressSpace
,
426 PMM_FREE_PAGE_FUNC FreePage
,
427 PVOID FreePageContext
);
430 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
433 MmLocateMemoryAreaByRegion(
434 PMADDRESS_SPACE AddressSpace
,
440 PMADDRESS_SPACE AddressSpace
,
442 ULONG_PTR Granularity
,
446 MmReleaseMemoryAreaIfDecommitted(
448 PMADDRESS_SPACE AddressSpace
,
451 /* npool.c *******************************************************************/
453 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
455 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
457 VOID
MiInitializeNonPagedPool(VOID
);
459 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
461 /* pool.c *******************************************************************/
466 IN POOL_TYPE PoolType
,
467 IN ULONG CurrentMaxQuota
,
468 OUT PULONG NewMaxQuota
471 /* mdl.c *********************************************************************/
473 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
475 /* mminit.c ******************************************************************/
477 VOID
MiShutdownMemoryManager(VOID
);
479 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
480 ULONG_PTR LastKernelPhysAddress
,
481 ULONG_PTR LastKernelAddress
,
482 PADDRESS_RANGE BIOSMemoryMap
,
483 ULONG AddressRangeCount
,
490 VOID
MiFreeInitMemory(VOID
);
492 VOID
MmInitializeMdlImplementation(VOID
);
494 /* pagefile.c ****************************************************************/
496 SWAPENTRY
MmAllocSwapPage(VOID
);
498 VOID
MmDereserveSwapPages(ULONG Nr
);
500 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
502 VOID
MmInitPagingFile(VOID
);
504 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
506 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
508 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
511 MmDumpToPagingFile(ULONG BugCode
,
512 ULONG BugCodeParameter1
,
513 ULONG BugCodeParameter2
,
514 ULONG BugCodeParameter3
,
515 ULONG BugCodeParameter4
,
516 struct _KTRAP_FRAME
* TrapFrame
);
518 BOOLEAN
MmIsAvailableSwapPage(VOID
);
520 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
522 /* process.c ****************************************************************/
526 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
527 IN PSECTION_OBJECT Section OPTIONAL
);
531 MmCreatePeb(PEPROCESS Process
);
535 MmCreateTeb(PEPROCESS Process
,
537 PINITIAL_TEB InitialTeb
);
541 MmDeleteTeb(PEPROCESS Process
,
544 /* i386/pfault.c *************************************************************/
546 NTSTATUS
MmPageFault(ULONG Cs
,
552 /* mm.c **********************************************************************/
554 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
558 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
562 /* anonmem.c *****************************************************************/
564 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
565 MEMORY_AREA
* MemoryArea
,
569 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
570 PMEMORY_AREA MemoryArea
,
572 struct _MM_PAGEOP
* PageOp
);
574 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
576 PMEMORY_BASIC_INFORMATION Info
,
577 PULONG ResultLength
);
579 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
581 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
582 PMEMORY_AREA MemoryArea
,
588 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
593 /* kmap.c ********************************************************************/
595 PVOID
ExAllocatePage(VOID
);
597 VOID
ExUnmapPage(PVOID Addr
);
599 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
601 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
603 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
605 /* memsafe.s *****************************************************************/
607 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
609 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
611 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
613 /* pageop.c ******************************************************************/
616 MmReleasePageOp(PMM_PAGEOP PageOp
);
619 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
620 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
622 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
623 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
625 MmInitializePageOp(VOID
);
627 /* process.c *****************************************************************/
631 MmCreateKernelStack(BOOLEAN GuiStack
);
635 MmDeleteKernelStack(PVOID Stack
,
638 /* balace.c ******************************************************************/
640 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
641 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
643 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
645 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
647 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
649 VOID
MiInitBalancerThread(VOID
);
651 VOID
MmRebalanceMemoryConsumers(VOID
);
653 /* rmap.c **************************************************************/
655 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
657 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
659 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
661 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
662 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
664 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
666 VOID
MmInitializeRmapList(VOID
);
668 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
670 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
672 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
674 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
676 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
678 /* freelist.c **********************************************************/
680 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
682 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
684 VOID
MmSetLRULastPage(PFN_TYPE Page
);
686 VOID
MmLockPage(PFN_TYPE Page
);
687 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
689 VOID
MmUnlockPage(PFN_TYPE Page
);
691 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
693 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
694 ULONG_PTR LastPhysKernelAddress
,
695 ULONG MemorySizeInPages
,
696 ULONG_PTR LastKernelBase
,
697 PADDRESS_RANGE BIOSMemoryMap
,
698 ULONG AddressRangeCount
);
700 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
701 PHYSICAL_ADDRESS LowestAcceptableAddress
,
702 PHYSICAL_ADDRESS HighestAcceptableAddress
,
705 NTSTATUS
MmInitZeroPageThread(VOID
);
707 /* i386/page.c *********************************************************/
709 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
711 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
713 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
715 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
720 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
722 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
728 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
734 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
736 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
740 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
743 VOID
MmInitGlobalKernelPageDirectory(VOID
);
745 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
747 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
749 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
751 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
753 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
755 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
757 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
759 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
761 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
763 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
764 PHYSICAL_ADDRESS LowestAddress
,
765 PHYSICAL_ADDRESS HighestAddress
,
769 VOID
MmDereferencePage(PFN_TYPE Page
);
771 VOID
MmReferencePage(PFN_TYPE Page
);
772 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
774 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
776 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
778 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
780 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
782 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
784 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
786 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
788 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
790 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
792 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
794 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
798 MmCopyMmInfo(struct _EPROCESS
* Src
,
799 struct _EPROCESS
* Dest
,
800 PPHYSICAL_ADDRESS DirectoryTableBase
);
802 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
804 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
806 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
812 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
814 VOID
MmMarkPageMapped(PFN_TYPE Page
);
816 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
818 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
820 VOID
MiInitPageDirectoryMap(VOID
);
822 ULONG
MiGetUserPageDirectoryCount(VOID
);
824 /* wset.c ********************************************************************/
826 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
828 /* region.c ************************************************************/
830 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
831 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
832 ULONG NewType
, ULONG NewProtect
,
833 PMM_ALTER_REGION_FUNC AlterFunc
);
835 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
838 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
839 PVOID
* RegionBaseAddress
);
841 /* section.c *****************************************************************/
844 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
847 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
849 PMEMORY_BASIC_INFORMATION Info
,
850 PULONG ResultLength
);
853 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
854 PMEMORY_AREA MemoryArea
,
861 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
866 NTSTATUS
MmInitSectionImplementation(VOID
);
869 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
871 /* FIXME: it should be in ddk/mmfuncs.h */
873 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
874 IN ACCESS_MASK DesiredAccess
,
875 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
876 IN PLARGE_INTEGER MaximumSize
,
877 IN ULONG SectionPageProtection
,
878 IN ULONG AllocationAttributes
,
879 IN HANDLE FileHandle OPTIONAL
,
880 IN PFILE_OBJECT File OPTIONAL
);
883 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
884 MEMORY_AREA
* MemoryArea
,
889 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
890 PMEMORY_AREA MemoryArea
,
892 struct _MM_PAGEOP
* PageOp
);
895 MmCreatePhysicalMemorySection(VOID
);
898 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
899 MEMORY_AREA
* MemoryArea
,
904 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
906 /* mpw.c *********************************************************************/
908 NTSTATUS
MmInitMpwThread(VOID
);
910 /* pager.c *******************************************************************/
912 BOOLEAN
MiIsPagerThread(VOID
);
914 VOID
MiStartPagerThread(VOID
);
916 VOID
MiStopPagerThread(VOID
);