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)
41 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
43 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
44 ((((x)) % (4*1024*1024)) / (4*1024))
46 #define NR_SECTION_PAGE_TABLES (1024)
47 #define NR_SECTION_PAGE_ENTRIES (1024)
50 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
53 #define MM_VIRTMEM_GRANULARITY (64 * 1024) /* Although Microsoft says this isn't hardcoded anymore,
54 they won't be able to change it. Stuff depends on it */
56 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
59 * Additional flags for protection attributes
61 #define PAGE_WRITETHROUGH (1024)
62 #define PAGE_SYSTEM (2048)
63 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
68 PAGE_EXECUTE_READWRITE | \
69 PAGE_EXECUTE_WRITECOPY | \
74 #define PAGE_IS_READABLE (PAGE_READONLY | \
78 PAGE_EXECUTE_READWRITE | \
79 PAGE_EXECUTE_WRITECOPY)
81 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
83 PAGE_EXECUTE_READWRITE | \
84 PAGE_EXECUTE_WRITECOPY)
86 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
88 PAGE_EXECUTE_READWRITE | \
89 PAGE_EXECUTE_WRITECOPY)
91 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
92 PAGE_EXECUTE_WRITECOPY)
96 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
97 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
101 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
102 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
104 #define SEC_PHYSICALMEMORY (0x80000000)
106 #define MM_PAGEFILE_SEGMENT (0x1)
107 #define MM_DATAFILE_SEGMENT (0x2)
109 typedef struct _MM_SECTION_SEGMENT
112 ULONG_PTR VirtualAddress
;
117 ULONG ReferenceCount
;
118 SECTION_PAGE_DIRECTORY PageDirectory
;
120 ULONG Characteristics
;
122 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
124 typedef struct _MM_IMAGE_SECTION_OBJECT
127 ULONG_PTR StackReserve
;
128 ULONG_PTR StackCommit
;
129 ULONG_PTR EntryPoint
;
131 ULONG ImageCharacteristics
;
132 USHORT MinorSubsystemVersion
;
133 USHORT MajorSubsystemVersion
;
137 PMM_SECTION_SEGMENT Segments
;
138 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
140 typedef struct _SECTION_OBJECT
144 LARGE_INTEGER MaximumSize
;
145 ULONG SectionPageProtection
;
146 ULONG AllocationAttributes
;
147 PFILE_OBJECT FileObject
;
148 LIST_ENTRY ViewListHead
;
149 KSPIN_LOCK ViewListLock
;
152 PMM_IMAGE_SECTION_OBJECT ImageSection
;
153 PMM_SECTION_SEGMENT Segment
;
159 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
161 typedef struct _EPROCESS_QUOTA_ENTRY
{
166 } EPROCESS_QUOTA_ENTRY
, *PEPROCESS_QUOTA_ENTRY
;
168 typedef struct _EPROCESS_QUOTA_BLOCK
{
169 EPROCESS_QUOTA_ENTRY QuotaEntry
[3];
170 LIST_ENTRY QuotaList
;
171 ULONG ReferenceCount
;
173 } EPROCESS_QUOTA_BLOCK
, *PEPROCESS_QUOTA_BLOCK
;
179 typedef struct _PAGEFAULT_HISTORY
185 struct _PROCESS_WS_WATCH_INFORMATION WatchInfo
[1];
186 } PAGEFAULT_HISTORY
, *PPAGEFAULT_HISTORY
;
188 #endif /* __USE_W32API */
190 typedef struct _MEMORY_AREA
192 PVOID StartingAddress
;
194 struct _MEMORY_AREA
*Parent
;
195 struct _MEMORY_AREA
*LeftChild
;
196 struct _MEMORY_AREA
*RightChild
;
200 struct _EPROCESS
* Process
; /* FIXME: We don't need this! */
201 BOOLEAN DeleteInProgress
;
207 SECTION_OBJECT
* Section
;
209 LIST_ENTRY ViewListEntry
;
210 PMM_SECTION_SEGMENT Segment
;
211 BOOLEAN WriteCopyView
;
212 LIST_ENTRY RegionListHead
;
216 LIST_ENTRY RegionListHead
;
219 } MEMORY_AREA
, *PMEMORY_AREA
;
221 typedef struct _MADDRESS_SPACE
223 PMEMORY_AREA MemoryAreaRoot
;
226 struct _EPROCESS
* Process
;
227 PUSHORT PageTableRefCountTable
;
228 ULONG PageTableRefCountTableSize
;
229 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
231 typedef struct _KNODE
{
234 ULONG MmShiftedColor
;
236 SLIST_HEADER DeadStackList
;
237 SLIST_HEADER PfnDereferenceSListHead
;
238 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
248 extern PVOID EXPORTED MmSystemRangeStart
;
250 extern PVOID IMPORTED MmSystemRangeStart
;
253 #endif /* __USE_W32API */
259 ULONG NrReservedPages
;
264 ULONG PagingRequestsInLastMinute
;
265 ULONG PagingRequestsInLastFiveMinutes
;
266 ULONG PagingRequestsInLastFifteenMinutes
;
269 extern MM_STATS MmStats
;
271 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
273 #define MM_PAGEOP_PAGEIN (1)
274 #define MM_PAGEOP_PAGEOUT (2)
275 #define MM_PAGEOP_PAGESYNCH (3)
276 #define MM_PAGEOP_ACCESSFAULT (4)
278 typedef struct _MM_PAGEOP
280 /* Type of operation. */
282 /* Number of threads interested in this operation. */
283 ULONG ReferenceCount
;
284 /* Event that will be set when the operation is completed. */
285 KEVENT CompletionEvent
;
286 /* Status of the operation once it is completed. */
288 /* TRUE if the operation was abandoned. */
290 /* The memory area to be affected by the operation. */
293 struct _MM_PAGEOP
* Next
;
294 struct _ETHREAD
* Thread
;
296 * These fields are used to identify the operation if it is against a
297 * virtual memory area.
302 * These fields are used to identify the operation if it is against a
305 PMM_SECTION_SEGMENT Segment
;
307 } MM_PAGEOP
, *PMM_PAGEOP
;
312 #define MC_NPPOOL (3)
313 #define MC_MAXIMUM (4)
315 typedef struct _MM_MEMORY_CONSUMER
319 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
321 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
323 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
325 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
328 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
329 PVOID BaseAddress
, ULONG Length
,
330 ULONG OldType
, ULONG OldProtect
,
331 ULONG NewType
, ULONG NewProtect
);
333 typedef struct _MM_REGION
338 LIST_ENTRY RegionListEntry
;
339 } MM_REGION
, *PMM_REGION
;
341 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
342 PVOID Address
, PFN_TYPE Page
,
343 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
347 /* aspace.c ******************************************************************/
349 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
351 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
353 VOID
MmInitializeKernelAddressSpace(VOID
);
355 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
357 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
359 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
360 PMADDRESS_SPACE AddressSpace
);
362 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
364 /* marea.c *******************************************************************/
366 NTSTATUS INIT_FUNCTION
367 MmInitMemoryAreas(VOID
);
371 struct _EPROCESS
* Process
,
372 PMADDRESS_SPACE AddressSpace
,
377 PMEMORY_AREA
*Result
,
378 BOOLEAN FixedAddress
,
380 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
383 MmLocateMemoryAreaByAddress(
384 PMADDRESS_SPACE AddressSpace
,
389 PMADDRESS_SPACE AddressSpace
,
394 PMADDRESS_SPACE AddressSpace
,
395 PMEMORY_AREA MemoryArea
,
396 PMM_FREE_PAGE_FUNC FreePage
,
397 PVOID FreePageContext
);
400 MmFreeMemoryAreaByPtr(
401 PMADDRESS_SPACE AddressSpace
,
403 PMM_FREE_PAGE_FUNC FreePage
,
404 PVOID FreePageContext
);
407 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
410 MmLocateMemoryAreaByRegion(
411 PMADDRESS_SPACE AddressSpace
,
417 PMADDRESS_SPACE AddressSpace
,
419 ULONG_PTR Granularity
,
423 MmReleaseMemoryAreaIfDecommitted(
425 PMADDRESS_SPACE AddressSpace
,
428 /* npool.c *******************************************************************/
430 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
432 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
434 VOID
MiInitializeNonPagedPool(VOID
);
436 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
438 /* pool.c *******************************************************************/
443 IN POOL_TYPE PoolType
,
444 IN ULONG CurrentMaxQuota
,
445 OUT PULONG NewMaxQuota
448 /* mdl.c *********************************************************************/
450 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
452 /* mminit.c ******************************************************************/
454 VOID
MiShutdownMemoryManager(VOID
);
456 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
457 ULONG_PTR LastKernelPhysAddress
,
458 ULONG_PTR LastKernelAddress
,
459 PADDRESS_RANGE BIOSMemoryMap
,
460 ULONG AddressRangeCount
,
467 VOID
MiFreeInitMemory(VOID
);
469 VOID
MmInitializeMdlImplementation(VOID
);
471 /* pagefile.c ****************************************************************/
473 SWAPENTRY
MmAllocSwapPage(VOID
);
475 VOID
MmDereserveSwapPages(ULONG Nr
);
477 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
479 VOID
MmInitPagingFile(VOID
);
481 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
483 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
485 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
488 MmDumpToPagingFile(ULONG BugCode
,
489 ULONG BugCodeParameter1
,
490 ULONG BugCodeParameter2
,
491 ULONG BugCodeParameter3
,
492 ULONG BugCodeParameter4
,
493 struct _KTRAP_FRAME
* TrapFrame
);
495 BOOLEAN
MmIsAvailableSwapPage(VOID
);
497 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
499 /* i386/pfault.c *************************************************************/
501 NTSTATUS
MmPageFault(ULONG Cs
,
507 /* mm.c **********************************************************************/
509 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
513 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
517 /* anonmem.c *****************************************************************/
519 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
520 MEMORY_AREA
* MemoryArea
,
524 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
525 PMEMORY_AREA MemoryArea
,
527 struct _MM_PAGEOP
* PageOp
);
529 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
531 PMEMORY_BASIC_INFORMATION Info
,
532 PULONG ResultLength
);
534 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
536 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
537 PMEMORY_AREA MemoryArea
,
543 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
548 /* kmap.c ********************************************************************/
550 PVOID
ExAllocatePage(VOID
);
552 VOID
ExUnmapPage(PVOID Addr
);
554 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
556 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
558 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
560 /* memsafe.s *****************************************************************/
562 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
564 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
566 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
568 /* pageop.c ******************************************************************/
571 MmReleasePageOp(PMM_PAGEOP PageOp
);
574 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
575 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
577 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
578 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
580 MmInitializePageOp(VOID
);
582 /* balace.c ******************************************************************/
584 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
585 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
587 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
589 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
591 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
593 VOID
MiInitBalancerThread(VOID
);
595 VOID
MmRebalanceMemoryConsumers(VOID
);
597 /* rmap.c **************************************************************/
599 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
601 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
603 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
605 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
606 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
608 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
610 VOID
MmInitializeRmapList(VOID
);
612 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
614 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
616 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
618 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
620 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
622 /* freelist.c **********************************************************/
624 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
626 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
628 VOID
MmSetLRULastPage(PFN_TYPE Page
);
630 VOID
MmLockPage(PFN_TYPE Page
);
631 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
633 VOID
MmUnlockPage(PFN_TYPE Page
);
635 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
637 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
638 ULONG_PTR LastPhysKernelAddress
,
639 ULONG MemorySizeInPages
,
640 ULONG_PTR LastKernelBase
,
641 PADDRESS_RANGE BIOSMemoryMap
,
642 ULONG AddressRangeCount
);
644 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
645 PHYSICAL_ADDRESS LowestAcceptableAddress
,
646 PHYSICAL_ADDRESS HighestAcceptableAddress
,
649 NTSTATUS
MmInitZeroPageThread(VOID
);
651 /* i386/page.c *********************************************************/
653 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
655 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
657 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
659 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
664 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
666 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
672 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
678 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
680 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
684 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
687 VOID
MmInitGlobalKernelPageDirectory(VOID
);
689 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
691 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
693 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
695 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
697 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
699 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
701 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
703 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
705 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
707 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
708 PHYSICAL_ADDRESS LowestAddress
,
709 PHYSICAL_ADDRESS HighestAddress
,
713 VOID
MmDereferencePage(PFN_TYPE Page
);
715 VOID
MmReferencePage(PFN_TYPE Page
);
716 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
718 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
720 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
722 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
724 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
726 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
728 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
730 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
732 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
734 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
736 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
738 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
740 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
, struct _EPROCESS
* Dest
);
742 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
744 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
746 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
752 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
754 VOID
MmMarkPageMapped(PFN_TYPE Page
);
756 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
758 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
760 VOID
MiInitPageDirectoryMap(VOID
);
762 ULONG
MiGetUserPageDirectoryCount(VOID
);
764 /* wset.c ********************************************************************/
766 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
768 /* region.c ************************************************************/
770 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
771 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
772 ULONG NewType
, ULONG NewProtect
,
773 PMM_ALTER_REGION_FUNC AlterFunc
);
775 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
778 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
779 PVOID
* RegionBaseAddress
);
781 /* section.c *****************************************************************/
784 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
787 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
789 PMEMORY_BASIC_INFORMATION Info
,
790 PULONG ResultLength
);
793 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
794 PMEMORY_AREA MemoryArea
,
801 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
806 NTSTATUS
MmInitSectionImplementation(VOID
);
809 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
811 /* FIXME: it should be in ddk/mmfuncs.h */
813 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
814 IN ACCESS_MASK DesiredAccess
,
815 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
816 IN PLARGE_INTEGER MaximumSize
,
817 IN ULONG SectionPageProtection
,
818 IN ULONG AllocationAttributes
,
819 IN HANDLE FileHandle OPTIONAL
,
820 IN PFILE_OBJECT File OPTIONAL
);
823 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
824 MEMORY_AREA
* MemoryArea
,
829 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
830 PMEMORY_AREA MemoryArea
,
832 struct _MM_PAGEOP
* PageOp
);
835 MmCreatePhysicalMemorySection(VOID
);
838 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
839 MEMORY_AREA
* MemoryArea
,
844 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
846 /* mpw.c *********************************************************************/
848 NTSTATUS
MmInitMpwThread(VOID
);
850 /* pager.c *******************************************************************/
852 BOOLEAN
MiIsPagerThread(VOID
);
854 VOID
MiStartPagerThread(VOID
);
856 VOID
MiStopPagerThread(VOID
);