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 VOID
MmLockPagedPool(VOID
);
371 VOID
MmUnlockPagedPool(VOID
);
373 /* aspace.c ******************************************************************/
375 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
377 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
379 VOID
MmInitializeKernelAddressSpace(VOID
);
381 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
383 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
385 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
386 PMADDRESS_SPACE AddressSpace
);
388 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
390 /* marea.c *******************************************************************/
392 NTSTATUS INIT_FUNCTION
393 MmInitMemoryAreas(VOID
);
397 struct _EPROCESS
* Process
,
398 PMADDRESS_SPACE AddressSpace
,
403 PMEMORY_AREA
*Result
,
404 BOOLEAN FixedAddress
,
406 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
409 MmLocateMemoryAreaByAddress(
410 PMADDRESS_SPACE AddressSpace
,
415 PMADDRESS_SPACE AddressSpace
,
420 PMADDRESS_SPACE AddressSpace
,
421 PMEMORY_AREA MemoryArea
,
422 PMM_FREE_PAGE_FUNC FreePage
,
423 PVOID FreePageContext
);
426 MmFreeMemoryAreaByPtr(
427 PMADDRESS_SPACE AddressSpace
,
429 PMM_FREE_PAGE_FUNC FreePage
,
430 PVOID FreePageContext
);
433 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
436 MmLocateMemoryAreaByRegion(
437 PMADDRESS_SPACE AddressSpace
,
443 PMADDRESS_SPACE AddressSpace
,
445 ULONG_PTR Granularity
,
449 MmReleaseMemoryAreaIfDecommitted(
451 PMADDRESS_SPACE AddressSpace
,
454 /* npool.c *******************************************************************/
456 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
458 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
460 VOID
MiInitializeNonPagedPool(VOID
);
462 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
464 /* pool.c *******************************************************************/
469 IN POOL_TYPE PoolType
,
470 IN ULONG CurrentMaxQuota
,
471 OUT PULONG NewMaxQuota
474 /* mdl.c *********************************************************************/
476 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
478 /* mminit.c ******************************************************************/
480 VOID
MiShutdownMemoryManager(VOID
);
482 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
483 ULONG_PTR LastKernelPhysAddress
,
484 ULONG_PTR LastKernelAddress
,
485 PADDRESS_RANGE BIOSMemoryMap
,
486 ULONG AddressRangeCount
,
493 VOID
MiFreeInitMemory(VOID
);
495 VOID
MmInitializeMdlImplementation(VOID
);
497 /* pagefile.c ****************************************************************/
499 SWAPENTRY
MmAllocSwapPage(VOID
);
501 VOID
MmDereserveSwapPages(ULONG Nr
);
503 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
505 VOID
MmInitPagingFile(VOID
);
507 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
509 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
511 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
514 MmDumpToPagingFile(ULONG BugCode
,
515 ULONG BugCodeParameter1
,
516 ULONG BugCodeParameter2
,
517 ULONG BugCodeParameter3
,
518 ULONG BugCodeParameter4
,
519 struct _KTRAP_FRAME
* TrapFrame
);
521 BOOLEAN
MmIsAvailableSwapPage(VOID
);
523 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
525 /* process.c ****************************************************************/
529 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
530 IN PSECTION_OBJECT Section OPTIONAL
);
534 MmCreatePeb(PEPROCESS Process
);
538 MmCreateTeb(PEPROCESS Process
,
540 PINITIAL_TEB InitialTeb
);
544 MmDeleteTeb(PEPROCESS Process
,
547 /* i386/pfault.c *************************************************************/
549 NTSTATUS
MmPageFault(ULONG Cs
,
555 /* mm.c **********************************************************************/
557 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
561 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
565 /* anonmem.c *****************************************************************/
567 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
568 MEMORY_AREA
* MemoryArea
,
572 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
573 PMEMORY_AREA MemoryArea
,
575 struct _MM_PAGEOP
* PageOp
);
577 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
579 PMEMORY_BASIC_INFORMATION Info
,
580 PULONG ResultLength
);
582 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
584 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
585 PMEMORY_AREA MemoryArea
,
591 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
596 /* kmap.c ********************************************************************/
598 PVOID
ExAllocatePage(VOID
);
600 VOID
ExUnmapPage(PVOID Addr
);
602 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
604 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
606 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
608 /* memsafe.s *****************************************************************/
610 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
612 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
614 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
616 /* pageop.c ******************************************************************/
619 MmReleasePageOp(PMM_PAGEOP PageOp
);
622 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
623 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
625 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
626 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
628 MmInitializePageOp(VOID
);
630 /* process.c *****************************************************************/
634 MmCreateKernelStack(BOOLEAN GuiStack
);
638 MmDeleteKernelStack(PVOID Stack
,
641 /* balace.c ******************************************************************/
643 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
644 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
646 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
648 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
650 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
652 VOID
MiInitBalancerThread(VOID
);
654 VOID
MmRebalanceMemoryConsumers(VOID
);
656 /* rmap.c **************************************************************/
658 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
660 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
662 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
664 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
665 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
667 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
669 VOID
MmInitializeRmapList(VOID
);
671 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
673 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
675 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
677 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
679 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
681 /* freelist.c **********************************************************/
683 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
685 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
687 VOID
MmSetLRULastPage(PFN_TYPE Page
);
689 VOID
MmLockPage(PFN_TYPE Page
);
690 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
692 VOID
MmUnlockPage(PFN_TYPE Page
);
694 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
696 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
697 ULONG_PTR LastPhysKernelAddress
,
698 ULONG MemorySizeInPages
,
699 ULONG_PTR LastKernelBase
,
700 PADDRESS_RANGE BIOSMemoryMap
,
701 ULONG AddressRangeCount
);
703 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
704 PHYSICAL_ADDRESS LowestAcceptableAddress
,
705 PHYSICAL_ADDRESS HighestAcceptableAddress
,
708 NTSTATUS
MmInitZeroPageThread(VOID
);
710 /* i386/page.c *********************************************************/
712 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
714 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
716 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
718 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
723 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
725 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
731 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
737 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
739 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
743 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
746 VOID
MmInitGlobalKernelPageDirectory(VOID
);
748 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
750 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
752 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
754 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
756 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
758 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
760 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
762 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
764 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
766 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
767 PHYSICAL_ADDRESS LowestAddress
,
768 PHYSICAL_ADDRESS HighestAddress
,
772 VOID
MmDereferencePage(PFN_TYPE Page
);
774 VOID
MmReferencePage(PFN_TYPE Page
);
775 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
777 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
779 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
781 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
783 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
785 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
787 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
789 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
791 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
793 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
795 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
797 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
801 MmCopyMmInfo(struct _EPROCESS
* Src
,
802 struct _EPROCESS
* Dest
,
803 PPHYSICAL_ADDRESS DirectoryTableBase
);
805 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
807 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
809 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
815 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
817 VOID
MmMarkPageMapped(PFN_TYPE Page
);
819 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
821 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
823 VOID
MiInitPageDirectoryMap(VOID
);
825 ULONG
MiGetUserPageDirectoryCount(VOID
);
827 /* wset.c ********************************************************************/
829 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
831 /* region.c ************************************************************/
833 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
834 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
835 ULONG NewType
, ULONG NewProtect
,
836 PMM_ALTER_REGION_FUNC AlterFunc
);
838 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
841 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
842 PVOID
* RegionBaseAddress
);
844 /* section.c *****************************************************************/
847 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
850 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
852 PMEMORY_BASIC_INFORMATION Info
,
853 PULONG ResultLength
);
856 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
857 PMEMORY_AREA MemoryArea
,
864 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
869 NTSTATUS
MmInitSectionImplementation(VOID
);
872 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
874 /* FIXME: it should be in ddk/mmfuncs.h */
876 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
877 IN ACCESS_MASK DesiredAccess
,
878 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
879 IN PLARGE_INTEGER MaximumSize
,
880 IN ULONG SectionPageProtection
,
881 IN ULONG AllocationAttributes
,
882 IN HANDLE FileHandle OPTIONAL
,
883 IN PFILE_OBJECT File OPTIONAL
);
886 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
887 MEMORY_AREA
* MemoryArea
,
892 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
893 PMEMORY_AREA MemoryArea
,
895 struct _MM_PAGEOP
* PageOp
);
898 MmCreatePhysicalMemorySection(VOID
);
901 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
902 MEMORY_AREA
* MemoryArea
,
907 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
909 /* mpw.c *********************************************************************/
911 NTSTATUS
MmInitMpwThread(VOID
);
913 /* pager.c *******************************************************************/
915 BOOLEAN
MiIsPagerThread(VOID
);
917 VOID
MiStartPagerThread(VOID
);
919 VOID
MiStopPagerThread(VOID
);