1 #ifndef __INCLUDE_INTERNAL_MM_H
2 #define __INCLUDE_INTERNAL_MM_H
4 #include <internal/arch/mm.h>
6 /* TYPES *********************************************************************/
8 extern ULONG MiFreeSwapPages
;
9 extern ULONG MiUsedSwapPages
;
10 extern ULONG MmPagedPoolSize
;
11 extern ULONG MmTotalPagedPoolQuota
;
12 extern ULONG MmTotalNonPagedPoolQuota
;
15 struct _MM_RMAP_ENTRY
;
18 typedef ULONG SWAPENTRY
;
19 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
21 #define MEMORY_AREA_INVALID (0)
22 #define MEMORY_AREA_SECTION_VIEW (1)
23 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
24 #define MEMORY_AREA_NO_CACHE (3)
25 #define MEMORY_AREA_IO_MAPPING (4)
26 #define MEMORY_AREA_SYSTEM (5)
27 #define MEMORY_AREA_MDL_MAPPING (7)
28 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
29 #define MEMORY_AREA_CACHE_SEGMENT (9)
30 #define MEMORY_AREA_SHARED_DATA (10)
31 #define MEMORY_AREA_KERNEL_STACK (11)
32 #define MEMORY_AREA_PAGED_POOL (12)
33 #define MEMORY_AREA_NO_ACCESS (13)
34 #define MEMORY_AREA_PEB_OR_TEB (14)
36 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
38 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
39 ((((x)) % (4*1024*1024)) / (4*1024))
41 #define NR_SECTION_PAGE_TABLES (1024)
42 #define NR_SECTION_PAGE_ENTRIES (1024)
44 #define TEB_BASE (0x7FFDE000)
45 #define KPCR_BASE 0xFF000000
47 /* Although Microsoft says this isn't hardcoded anymore,
48 they won't be able to change it. Stuff depends on it */
49 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
51 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
54 * Additional flags for protection attributes
56 #define PAGE_WRITETHROUGH (1024)
57 #define PAGE_SYSTEM (2048)
58 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
63 PAGE_EXECUTE_READWRITE | \
64 PAGE_EXECUTE_WRITECOPY | \
69 #define PAGE_IS_READABLE (PAGE_READONLY | \
73 PAGE_EXECUTE_READWRITE | \
74 PAGE_EXECUTE_WRITECOPY)
76 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
78 PAGE_EXECUTE_READWRITE | \
79 PAGE_EXECUTE_WRITECOPY)
81 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
83 PAGE_EXECUTE_READWRITE | \
84 PAGE_EXECUTE_WRITECOPY)
86 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
87 PAGE_EXECUTE_WRITECOPY)
91 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
92 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
96 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
97 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
99 #define SEC_PHYSICALMEMORY (0x80000000)
101 #define MM_PAGEFILE_SEGMENT (0x1)
102 #define MM_DATAFILE_SEGMENT (0x2)
104 typedef struct _MM_SECTION_SEGMENT
107 ULONG_PTR VirtualAddress
;
112 ULONG ReferenceCount
;
113 SECTION_PAGE_DIRECTORY PageDirectory
;
115 ULONG Characteristics
;
117 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
119 typedef struct _MM_IMAGE_SECTION_OBJECT
122 ULONG_PTR StackReserve
;
123 ULONG_PTR StackCommit
;
124 ULONG_PTR EntryPoint
;
126 ULONG ImageCharacteristics
;
127 USHORT MinorSubsystemVersion
;
128 USHORT MajorSubsystemVersion
;
132 PMM_SECTION_SEGMENT Segments
;
133 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
135 typedef struct _SECTION_OBJECT
139 LARGE_INTEGER MaximumSize
;
140 ULONG SectionPageProtection
;
141 ULONG AllocationAttributes
;
142 PFILE_OBJECT FileObject
;
145 PMM_IMAGE_SECTION_OBJECT ImageSection
;
146 PMM_SECTION_SEGMENT Segment
;
150 typedef struct _MEMORY_AREA
152 PVOID StartingAddress
;
154 struct _MEMORY_AREA
*Parent
;
155 struct _MEMORY_AREA
*LeftChild
;
156 struct _MEMORY_AREA
*RightChild
;
160 BOOLEAN DeleteInProgress
;
166 SECTION_OBJECT
* Section
;
168 PMM_SECTION_SEGMENT Segment
;
169 BOOLEAN WriteCopyView
;
170 LIST_ENTRY RegionListHead
;
174 LIST_ENTRY RegionListHead
;
177 } MEMORY_AREA
, *PMEMORY_AREA
;
180 typedef struct _MADDRESS_SPACE
182 PMEMORY_AREA MemoryAreaRoot
;
185 struct _EPROCESS
* Process
;
186 PUSHORT PageTableRefCountTable
;
187 ULONG PageTableRefCountTableSize
;
188 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
195 ULONG NrReservedPages
;
200 ULONG PagingRequestsInLastMinute
;
201 ULONG PagingRequestsInLastFiveMinutes
;
202 ULONG PagingRequestsInLastFifteenMinutes
;
205 extern MM_STATS MmStats
;
207 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
209 #define MM_CORE_DUMP_TYPE_NONE (0x0)
210 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
211 #define MM_CORE_DUMP_TYPE_FULL (0x2)
213 #define MM_PAGEOP_PAGEIN (1)
214 #define MM_PAGEOP_PAGEOUT (2)
215 #define MM_PAGEOP_PAGESYNCH (3)
216 #define MM_PAGEOP_ACCESSFAULT (4)
218 typedef struct _MM_PAGEOP
220 /* Type of operation. */
222 /* Number of threads interested in this operation. */
223 ULONG ReferenceCount
;
224 /* Event that will be set when the operation is completed. */
225 KEVENT CompletionEvent
;
226 /* Status of the operation once it is completed. */
228 /* TRUE if the operation was abandoned. */
230 /* The memory area to be affected by the operation. */
233 struct _MM_PAGEOP
* Next
;
234 struct _ETHREAD
* Thread
;
236 * These fields are used to identify the operation if it is against a
237 * virtual memory area.
242 * These fields are used to identify the operation if it is against a
245 PMM_SECTION_SEGMENT Segment
;
247 } MM_PAGEOP
, *PMM_PAGEOP
;
252 #define MC_NPPOOL (3)
253 #define MC_MAXIMUM (4)
255 typedef struct _MM_MEMORY_CONSUMER
259 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
261 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
263 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
265 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
268 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
269 PVOID BaseAddress
, ULONG Length
,
270 ULONG OldType
, ULONG OldProtect
,
271 ULONG NewType
, ULONG NewProtect
);
273 typedef struct _MM_REGION
278 LIST_ENTRY RegionListEntry
;
279 } MM_REGION
, *PMM_REGION
;
281 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
282 PVOID Address
, PFN_TYPE Page
,
283 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
285 PVOID STDCALL
ExAllocateNonPagedPoolWithTag (POOL_TYPE type
,
290 PVOID STDCALL
ExAllocatePagedPoolWithTag (POOL_TYPE Type
,
293 VOID STDCALL
ExFreeNonPagedPool (PVOID block
);
296 ExFreePagedPool(IN PVOID Block
);
297 VOID
MmInitializePagedPool(VOID
);
301 MiAllocateSpecialPool (IN POOL_TYPE PoolType
,
302 IN SIZE_T NumberOfBytes
,
307 extern PVOID MmPagedPoolBase
;
308 extern ULONG MmPagedPoolSize
;
310 #define PAGED_POOL_MASK 1
311 #define MUST_SUCCEED_POOL_MASK 2
312 #define CACHE_ALIGNED_POOL_MASK 4
313 #define QUOTA_POOL_MASK 8
314 #define SESSION_POOL_MASK 32
315 #define VERIFIER_POOL_MASK 64
317 #define MM_PAGED_POOL_SIZE (100*1024*1024)
318 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
321 * Paged and non-paged pools are 8-byte aligned
323 #define MM_POOL_ALIGNMENT 8
326 * Maximum size of the kmalloc area (this is totally arbitary)
328 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
329 #define MM_KERNEL_MAP_BASE (0xf0c00000)
332 * FIXME - different architectures have different cache line sizes...
334 #define MM_CACHE_LINE_SIZE 32
336 #define MM_ROUND_UP(x,s) ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
337 #define MM_ROUND_DOWN(x,s) ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
341 /* aspace.c ******************************************************************/
343 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
345 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
347 VOID
MmInitializeKernelAddressSpace(VOID
);
349 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
351 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
353 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
354 PMADDRESS_SPACE AddressSpace
);
356 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
358 /* marea.c *******************************************************************/
361 MmInitMemoryAreas(VOID
);
365 struct _EPROCESS
* Process
,
366 PMADDRESS_SPACE AddressSpace
,
371 PMEMORY_AREA
*Result
,
372 BOOLEAN FixedAddress
,
374 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
377 MmLocateMemoryAreaByAddress(
378 PMADDRESS_SPACE AddressSpace
,
383 PMADDRESS_SPACE AddressSpace
,
388 PMADDRESS_SPACE AddressSpace
,
389 PMEMORY_AREA MemoryArea
,
390 PMM_FREE_PAGE_FUNC FreePage
,
391 PVOID FreePageContext
);
394 MmFreeMemoryAreaByPtr(
395 PMADDRESS_SPACE AddressSpace
,
397 PMM_FREE_PAGE_FUNC FreePage
,
398 PVOID FreePageContext
);
401 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
404 MmLocateMemoryAreaByRegion(
405 PMADDRESS_SPACE AddressSpace
,
411 PMADDRESS_SPACE AddressSpace
,
413 ULONG_PTR Granularity
,
417 MmReleaseMemoryAreaIfDecommitted(
419 PMADDRESS_SPACE AddressSpace
,
422 /* npool.c *******************************************************************/
424 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
426 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
428 VOID
MiInitializeNonPagedPool(VOID
);
430 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
432 /* pool.c *******************************************************************/
437 IN POOL_TYPE PoolType
,
438 IN ULONG CurrentMaxQuota
,
439 OUT PULONG NewMaxQuota
442 /* mdl.c *********************************************************************/
444 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
446 /* mminit.c ******************************************************************/
448 VOID
MiShutdownMemoryManager(VOID
);
450 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
451 ULONG_PTR LastKernelPhysAddress
,
452 ULONG_PTR LastKernelAddress
,
453 PADDRESS_RANGE BIOSMemoryMap
,
454 ULONG AddressRangeCount
,
461 VOID
MiFreeInitMemory(VOID
);
463 VOID
MmInitializeMdlImplementation(VOID
);
465 /* pagefile.c ****************************************************************/
467 SWAPENTRY
MmAllocSwapPage(VOID
);
469 VOID
MmDereserveSwapPages(ULONG Nr
);
471 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
473 VOID
MmInitPagingFile(VOID
);
475 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
477 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
479 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
482 MmDumpToPagingFile(ULONG BugCode
,
483 ULONG BugCodeParameter1
,
484 ULONG BugCodeParameter2
,
485 ULONG BugCodeParameter3
,
486 ULONG BugCodeParameter4
,
487 struct _KTRAP_FRAME
* TrapFrame
);
489 BOOLEAN
MmIsAvailableSwapPage(VOID
);
491 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
493 /* process.c ****************************************************************/
497 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
498 IN PSECTION_OBJECT Section OPTIONAL
);
502 MmCreatePeb(PEPROCESS Process
);
506 MmCreateTeb(PEPROCESS Process
,
508 PINITIAL_TEB InitialTeb
);
512 MmDeleteTeb(PEPROCESS Process
,
515 /* i386/pfault.c *************************************************************/
517 NTSTATUS
MmPageFault(ULONG Cs
,
523 /* mm.c **********************************************************************/
525 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
529 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
533 /* anonmem.c *****************************************************************/
535 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
536 MEMORY_AREA
* MemoryArea
,
540 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
541 PMEMORY_AREA MemoryArea
,
543 struct _MM_PAGEOP
* PageOp
);
545 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
547 PMEMORY_BASIC_INFORMATION Info
,
548 PULONG ResultLength
);
550 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
552 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
553 PMEMORY_AREA MemoryArea
,
559 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
564 /* kmap.c ********************************************************************/
566 PVOID
ExAllocatePage(VOID
);
568 VOID
ExUnmapPage(PVOID Addr
);
570 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
572 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
574 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
576 /* memsafe.s *****************************************************************/
578 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
580 /* pageop.c ******************************************************************/
583 MmReleasePageOp(PMM_PAGEOP PageOp
);
586 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
587 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
589 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
590 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
592 MmInitializePageOp(VOID
);
594 /* process.c *****************************************************************/
598 MmCreateKernelStack(BOOLEAN GuiStack
);
602 MmDeleteKernelStack(PVOID Stack
,
605 /* balace.c ******************************************************************/
607 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
608 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
610 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
612 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
614 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
616 VOID
MiInitBalancerThread(VOID
);
618 VOID
MmRebalanceMemoryConsumers(VOID
);
620 /* rmap.c **************************************************************/
622 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
624 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
626 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
628 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
629 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
631 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
633 VOID
MmInitializeRmapList(VOID
);
635 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
637 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
639 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
641 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
643 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
645 /* freelist.c **********************************************************/
647 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
649 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
651 VOID
MmSetLRULastPage(PFN_TYPE Page
);
653 VOID
MmLockPage(PFN_TYPE Page
);
654 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
656 VOID
MmUnlockPage(PFN_TYPE Page
);
658 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
660 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
661 ULONG_PTR LastPhysKernelAddress
,
662 ULONG MemorySizeInPages
,
663 ULONG_PTR LastKernelBase
,
664 PADDRESS_RANGE BIOSMemoryMap
,
665 ULONG AddressRangeCount
);
667 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
668 PHYSICAL_ADDRESS LowestAcceptableAddress
,
669 PHYSICAL_ADDRESS HighestAcceptableAddress
,
670 PHYSICAL_ADDRESS BoundaryAddressMultiple
);
672 NTSTATUS
MmInitZeroPageThread(VOID
);
674 /* i386/page.c *********************************************************/
676 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
678 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
680 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
682 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
687 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
689 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
695 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
701 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
703 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
707 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
710 VOID
MmInitGlobalKernelPageDirectory(VOID
);
712 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
714 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
716 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
718 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
720 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
722 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
724 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
726 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
728 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
730 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
731 PHYSICAL_ADDRESS LowestAddress
,
732 PHYSICAL_ADDRESS HighestAddress
,
736 VOID
MmDereferencePage(PFN_TYPE Page
);
738 VOID
MmReferencePage(PFN_TYPE Page
);
739 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
741 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
743 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
745 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
747 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
749 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
751 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
753 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
755 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
757 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
759 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
761 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
765 MmCopyMmInfo(struct _EPROCESS
* Src
,
766 struct _EPROCESS
* Dest
,
767 PPHYSICAL_ADDRESS DirectoryTableBase
);
769 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
771 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
773 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
779 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
781 VOID
MmMarkPageMapped(PFN_TYPE Page
);
783 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
785 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
787 VOID
MiInitPageDirectoryMap(VOID
);
789 ULONG
MiGetUserPageDirectoryCount(VOID
);
791 /* wset.c ********************************************************************/
793 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
795 /* cont.c ********************************************************************/
798 MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes
,
799 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
800 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
801 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
802 IN MEMORY_CACHING_TYPE CacheType OPTIONAL
);
804 /* region.c ************************************************************/
806 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
807 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
808 ULONG NewType
, ULONG NewProtect
,
809 PMM_ALTER_REGION_FUNC AlterFunc
);
811 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
814 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
815 PVOID
* RegionBaseAddress
);
817 /* section.c *****************************************************************/
820 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
823 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
825 PMEMORY_BASIC_INFORMATION Info
,
826 PULONG ResultLength
);
829 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
830 PMEMORY_AREA MemoryArea
,
837 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
842 NTSTATUS
MmInitSectionImplementation(VOID
);
846 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
847 IN ACCESS_MASK DesiredAccess
,
848 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
849 IN PLARGE_INTEGER MaximumSize
,
850 IN ULONG SectionPageProtection
,
851 IN ULONG AllocationAttributes
,
852 IN HANDLE FileHandle OPTIONAL
,
853 IN PFILE_OBJECT File OPTIONAL
);
856 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
857 MEMORY_AREA
* MemoryArea
,
862 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
863 PMEMORY_AREA MemoryArea
,
865 struct _MM_PAGEOP
* PageOp
);
868 MmCreatePhysicalMemorySection(VOID
);
871 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
872 MEMORY_AREA
* MemoryArea
,
877 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
879 /* mpw.c *********************************************************************/
881 NTSTATUS
MmInitMpwThread(VOID
);
883 /* pager.c *******************************************************************/
885 BOOLEAN
MiIsPagerThread(VOID
);
887 VOID
MiStartPagerThread(VOID
);
889 VOID
MiStopPagerThread(VOID
);
893 MiQueryVirtualMemory (IN HANDLE ProcessHandle
,
895 IN CINT VirtualMemoryInformationClass
,
896 OUT PVOID VirtualMemoryInformation
,
898 OUT PULONG ResultLength
);