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 _MEMORY_AREA
193 PVOID StartingAddress
;
195 struct _MEMORY_AREA
*Parent
;
196 struct _MEMORY_AREA
*LeftChild
;
197 struct _MEMORY_AREA
*RightChild
;
201 struct _EPROCESS
* Process
; /* FIXME: We don't need this! */
202 BOOLEAN DeleteInProgress
;
208 SECTION_OBJECT
* Section
;
210 LIST_ENTRY ViewListEntry
;
211 PMM_SECTION_SEGMENT Segment
;
212 BOOLEAN WriteCopyView
;
213 LIST_ENTRY RegionListHead
;
217 LIST_ENTRY RegionListHead
;
220 } MEMORY_AREA
, *PMEMORY_AREA
;
222 typedef struct _MADDRESS_SPACE
224 PMEMORY_AREA MemoryAreaRoot
;
227 struct _EPROCESS
* Process
;
228 PUSHORT PageTableRefCountTable
;
229 ULONG PageTableRefCountTableSize
;
230 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
232 typedef struct _KNODE
{
235 ULONG MmShiftedColor
;
237 SLIST_HEADER DeadStackList
;
238 SLIST_HEADER PfnDereferenceSListHead
;
239 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
249 extern PVOID EXPORTED MmSystemRangeStart
;
251 extern PVOID IMPORTED MmSystemRangeStart
;
254 #endif /* __USE_W32API */
260 ULONG NrReservedPages
;
265 ULONG PagingRequestsInLastMinute
;
266 ULONG PagingRequestsInLastFiveMinutes
;
267 ULONG PagingRequestsInLastFifteenMinutes
;
270 extern MM_STATS MmStats
;
272 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
274 #define MM_PAGEOP_PAGEIN (1)
275 #define MM_PAGEOP_PAGEOUT (2)
276 #define MM_PAGEOP_PAGESYNCH (3)
277 #define MM_PAGEOP_ACCESSFAULT (4)
279 typedef struct _MM_PAGEOP
281 /* Type of operation. */
283 /* Number of threads interested in this operation. */
284 ULONG ReferenceCount
;
285 /* Event that will be set when the operation is completed. */
286 KEVENT CompletionEvent
;
287 /* Status of the operation once it is completed. */
289 /* TRUE if the operation was abandoned. */
291 /* The memory area to be affected by the operation. */
294 struct _MM_PAGEOP
* Next
;
295 struct _ETHREAD
* Thread
;
297 * These fields are used to identify the operation if it is against a
298 * virtual memory area.
303 * These fields are used to identify the operation if it is against a
306 PMM_SECTION_SEGMENT Segment
;
308 } MM_PAGEOP
, *PMM_PAGEOP
;
313 #define MC_NPPOOL (3)
314 #define MC_MAXIMUM (4)
316 typedef struct _MM_MEMORY_CONSUMER
320 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
322 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
324 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
326 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
329 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
330 PVOID BaseAddress
, ULONG Length
,
331 ULONG OldType
, ULONG OldProtect
,
332 ULONG NewType
, ULONG NewProtect
);
334 typedef struct _MM_REGION
339 LIST_ENTRY RegionListEntry
;
340 } MM_REGION
, *PMM_REGION
;
342 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
343 PVOID Address
, PFN_TYPE Page
,
344 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
348 /* aspace.c ******************************************************************/
350 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
352 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
354 VOID
MmInitializeKernelAddressSpace(VOID
);
356 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
358 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
360 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
361 PMADDRESS_SPACE AddressSpace
);
363 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
365 /* marea.c *******************************************************************/
367 NTSTATUS INIT_FUNCTION
368 MmInitMemoryAreas(VOID
);
372 struct _EPROCESS
* Process
,
373 PMADDRESS_SPACE AddressSpace
,
378 PMEMORY_AREA
*Result
,
379 BOOLEAN FixedAddress
,
381 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
384 MmLocateMemoryAreaByAddress(
385 PMADDRESS_SPACE AddressSpace
,
390 PMADDRESS_SPACE AddressSpace
,
395 PMADDRESS_SPACE AddressSpace
,
396 PMEMORY_AREA MemoryArea
,
397 PMM_FREE_PAGE_FUNC FreePage
,
398 PVOID FreePageContext
);
401 MmFreeMemoryAreaByPtr(
402 PMADDRESS_SPACE AddressSpace
,
404 PMM_FREE_PAGE_FUNC FreePage
,
405 PVOID FreePageContext
);
408 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
411 MmLocateMemoryAreaByRegion(
412 PMADDRESS_SPACE AddressSpace
,
418 PMADDRESS_SPACE AddressSpace
,
420 ULONG_PTR Granularity
,
424 MmReleaseMemoryAreaIfDecommitted(
426 PMADDRESS_SPACE AddressSpace
,
429 /* npool.c *******************************************************************/
431 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
433 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
435 VOID
MiInitializeNonPagedPool(VOID
);
437 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
439 /* pool.c *******************************************************************/
444 IN POOL_TYPE PoolType
,
445 IN ULONG CurrentMaxQuota
,
446 OUT PULONG NewMaxQuota
449 /* mdl.c *********************************************************************/
451 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
453 /* mminit.c ******************************************************************/
455 VOID
MiShutdownMemoryManager(VOID
);
457 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
458 ULONG_PTR LastKernelPhysAddress
,
459 ULONG_PTR LastKernelAddress
,
460 PADDRESS_RANGE BIOSMemoryMap
,
461 ULONG AddressRangeCount
,
468 VOID
MiFreeInitMemory(VOID
);
470 VOID
MmInitializeMdlImplementation(VOID
);
472 /* pagefile.c ****************************************************************/
474 SWAPENTRY
MmAllocSwapPage(VOID
);
476 VOID
MmDereserveSwapPages(ULONG Nr
);
478 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
480 VOID
MmInitPagingFile(VOID
);
482 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
484 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
486 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
489 MmDumpToPagingFile(ULONG BugCode
,
490 ULONG BugCodeParameter1
,
491 ULONG BugCodeParameter2
,
492 ULONG BugCodeParameter3
,
493 ULONG BugCodeParameter4
,
494 struct _KTRAP_FRAME
* TrapFrame
);
496 BOOLEAN
MmIsAvailableSwapPage(VOID
);
498 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
500 /* process.c ****************************************************************/
504 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
505 IN PSECTION_OBJECT Section OPTIONAL
);
509 MmCreatePeb(PEPROCESS Process
);
513 MmCreateTeb(PEPROCESS Process
,
515 PINITIAL_TEB InitialTeb
);
519 MmDeleteTeb(PEPROCESS Process
,
522 /* i386/pfault.c *************************************************************/
524 NTSTATUS
MmPageFault(ULONG Cs
,
530 /* mm.c **********************************************************************/
532 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
536 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
540 /* anonmem.c *****************************************************************/
542 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
543 MEMORY_AREA
* MemoryArea
,
547 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
548 PMEMORY_AREA MemoryArea
,
550 struct _MM_PAGEOP
* PageOp
);
552 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
554 PMEMORY_BASIC_INFORMATION Info
,
555 PULONG ResultLength
);
557 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
559 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
560 PMEMORY_AREA MemoryArea
,
566 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
571 /* kmap.c ********************************************************************/
573 PVOID
ExAllocatePage(VOID
);
575 VOID
ExUnmapPage(PVOID Addr
);
577 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
579 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
581 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
583 /* memsafe.s *****************************************************************/
585 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
587 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
589 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
591 /* pageop.c ******************************************************************/
594 MmReleasePageOp(PMM_PAGEOP PageOp
);
597 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
598 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
600 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
601 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
603 MmInitializePageOp(VOID
);
605 /* process.c *****************************************************************/
609 MmCreateKernelStack(BOOLEAN GuiStack
);
613 MmDeleteKernelStack(PVOID Stack
,
616 /* balace.c ******************************************************************/
618 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
619 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
621 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
623 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
625 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
627 VOID
MiInitBalancerThread(VOID
);
629 VOID
MmRebalanceMemoryConsumers(VOID
);
631 /* rmap.c **************************************************************/
633 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
635 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
637 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
639 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
640 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
642 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
644 VOID
MmInitializeRmapList(VOID
);
646 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
648 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
650 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
652 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
654 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
656 /* freelist.c **********************************************************/
658 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
660 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
662 VOID
MmSetLRULastPage(PFN_TYPE Page
);
664 VOID
MmLockPage(PFN_TYPE Page
);
665 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
667 VOID
MmUnlockPage(PFN_TYPE Page
);
669 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
671 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
672 ULONG_PTR LastPhysKernelAddress
,
673 ULONG MemorySizeInPages
,
674 ULONG_PTR LastKernelBase
,
675 PADDRESS_RANGE BIOSMemoryMap
,
676 ULONG AddressRangeCount
);
678 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
679 PHYSICAL_ADDRESS LowestAcceptableAddress
,
680 PHYSICAL_ADDRESS HighestAcceptableAddress
,
683 NTSTATUS
MmInitZeroPageThread(VOID
);
685 /* i386/page.c *********************************************************/
687 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
689 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
691 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
693 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
698 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
700 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
706 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
712 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
714 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
718 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
721 VOID
MmInitGlobalKernelPageDirectory(VOID
);
723 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
725 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
727 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
729 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
731 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
733 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
735 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
737 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
739 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
741 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
742 PHYSICAL_ADDRESS LowestAddress
,
743 PHYSICAL_ADDRESS HighestAddress
,
747 VOID
MmDereferencePage(PFN_TYPE Page
);
749 VOID
MmReferencePage(PFN_TYPE Page
);
750 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
752 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
754 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
756 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
758 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
760 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
762 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
764 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
766 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
768 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
770 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
772 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
776 MmCopyMmInfo(struct _EPROCESS
* Src
,
777 struct _EPROCESS
* Dest
,
778 PPHYSICAL_ADDRESS DirectoryTableBase
);
780 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
782 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
784 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
790 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
792 VOID
MmMarkPageMapped(PFN_TYPE Page
);
794 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
796 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
798 VOID
MiInitPageDirectoryMap(VOID
);
800 ULONG
MiGetUserPageDirectoryCount(VOID
);
802 /* wset.c ********************************************************************/
804 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
806 /* region.c ************************************************************/
808 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
809 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
810 ULONG NewType
, ULONG NewProtect
,
811 PMM_ALTER_REGION_FUNC AlterFunc
);
813 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
816 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
817 PVOID
* RegionBaseAddress
);
819 /* section.c *****************************************************************/
822 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
825 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
827 PMEMORY_BASIC_INFORMATION Info
,
828 PULONG ResultLength
);
831 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
832 PMEMORY_AREA MemoryArea
,
839 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
844 NTSTATUS
MmInitSectionImplementation(VOID
);
847 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
849 /* FIXME: it should be in ddk/mmfuncs.h */
851 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
852 IN ACCESS_MASK DesiredAccess
,
853 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
854 IN PLARGE_INTEGER MaximumSize
,
855 IN ULONG SectionPageProtection
,
856 IN ULONG AllocationAttributes
,
857 IN HANDLE FileHandle OPTIONAL
,
858 IN PFILE_OBJECT File OPTIONAL
);
861 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
862 MEMORY_AREA
* MemoryArea
,
867 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
868 PMEMORY_AREA MemoryArea
,
870 struct _MM_PAGEOP
* PageOp
);
873 MmCreatePhysicalMemorySection(VOID
);
876 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
877 MEMORY_AREA
* MemoryArea
,
882 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
884 /* mpw.c *********************************************************************/
886 NTSTATUS
MmInitMpwThread(VOID
);
888 /* pager.c *******************************************************************/
890 BOOLEAN
MiIsPagerThread(VOID
);
892 VOID
MiStartPagerThread(VOID
);
894 VOID
MiStopPagerThread(VOID
);