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
);
632 VOID
MmUnlockPage(PFN_TYPE Page
);
634 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
636 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
637 ULONG_PTR LastPhysKernelAddress
,
638 ULONG MemorySizeInPages
,
639 ULONG_PTR LastKernelBase
,
640 PADDRESS_RANGE BIOSMemoryMap
,
641 ULONG AddressRangeCount
);
643 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
644 PHYSICAL_ADDRESS LowestAcceptableAddress
,
645 PHYSICAL_ADDRESS HighestAcceptableAddress
,
648 NTSTATUS
MmInitZeroPageThread(VOID
);
650 /* i386/page.c *********************************************************/
652 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
654 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
656 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
658 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
663 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
665 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
671 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
677 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
679 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
683 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
686 VOID
MmInitGlobalKernelPageDirectory(VOID
);
688 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
690 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
692 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
694 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
696 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
698 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
700 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
702 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
704 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
706 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
707 PHYSICAL_ADDRESS LowestAddress
,
708 PHYSICAL_ADDRESS HighestAddress
,
712 VOID
MmDereferencePage(PFN_TYPE Page
);
714 VOID
MmReferencePage(PFN_TYPE Page
);
716 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
718 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
720 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
722 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
724 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
726 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
728 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
730 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
732 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
734 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
736 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
738 NTSTATUS
MmCopyMmInfo(struct _EPROCESS
* Src
, struct _EPROCESS
* Dest
);
740 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
742 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
744 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
750 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
752 VOID
MmMarkPageMapped(PFN_TYPE Page
);
754 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
756 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
758 VOID
MiInitPageDirectoryMap(VOID
);
760 ULONG
MiGetUserPageDirectoryCount(VOID
);
762 /* wset.c ********************************************************************/
764 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
766 /* region.c ************************************************************/
768 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
769 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
770 ULONG NewType
, ULONG NewProtect
,
771 PMM_ALTER_REGION_FUNC AlterFunc
);
773 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
776 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
777 PVOID
* RegionBaseAddress
);
779 /* section.c *****************************************************************/
782 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
785 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
787 PMEMORY_BASIC_INFORMATION Info
,
788 PULONG ResultLength
);
791 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
792 PMEMORY_AREA MemoryArea
,
799 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
804 NTSTATUS
MmInitSectionImplementation(VOID
);
807 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
809 /* FIXME: it should be in ddk/mmfuncs.h */
811 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
812 IN ACCESS_MASK DesiredAccess
,
813 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
814 IN PLARGE_INTEGER MaximumSize
,
815 IN ULONG SectionPageProtection
,
816 IN ULONG AllocationAttributes
,
817 IN HANDLE FileHandle OPTIONAL
,
818 IN PFILE_OBJECT File OPTIONAL
);
821 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
822 MEMORY_AREA
* MemoryArea
,
827 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
828 PMEMORY_AREA MemoryArea
,
830 struct _MM_PAGEOP
* PageOp
);
833 MmCreatePhysicalMemorySection(VOID
);
836 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
837 MEMORY_AREA
* MemoryArea
,
842 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
844 /* mpw.c *********************************************************************/
846 NTSTATUS
MmInitMpwThread(VOID
);
848 /* pager.c *******************************************************************/
850 BOOLEAN
MiIsPagerThread(VOID
);
852 VOID
MiStartPagerThread(VOID
);
854 VOID
MiStopPagerThread(VOID
);