3 * Copyright (C) 1998-2005 ReactOS Team (and the authors from the programmers section)
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/include/internal/mm.h
22 * PURPOSE: level memory managment definitions
24 * PROGRAMMERS: David Welch
33 * Thomas Weidenmueller
40 #ifndef __INCLUDE_INTERNAL_MM_H
41 #define __INCLUDE_INTERNAL_MM_H
43 #include <internal/ntoskrnl.h>
44 #include <internal/arch/mm.h>
46 /* TYPES *********************************************************************/
48 extern ULONG MiFreeSwapPages
;
49 extern ULONG MiUsedSwapPages
;
50 extern ULONG MmPagedPoolSize
;
51 extern ULONG MmTotalPagedPoolQuota
;
52 extern ULONG MmTotalNonPagedPoolQuota
;
56 struct _MM_RMAP_ENTRY
;
58 typedef ULONG SWAPENTRY
;
60 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
62 #define MEMORY_AREA_INVALID (0)
63 #define MEMORY_AREA_SECTION_VIEW (1)
64 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
65 #define MEMORY_AREA_NO_CACHE (3)
66 #define MEMORY_AREA_IO_MAPPING (4)
67 #define MEMORY_AREA_SYSTEM (5)
68 #define MEMORY_AREA_MDL_MAPPING (7)
69 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
70 #define MEMORY_AREA_CACHE_SEGMENT (9)
71 #define MEMORY_AREA_SHARED_DATA (10)
72 #define MEMORY_AREA_KERNEL_STACK (11)
73 #define MEMORY_AREA_PAGED_POOL (12)
74 #define MEMORY_AREA_NO_ACCESS (13)
75 #define MEMORY_AREA_PEB_OR_TEB (14)
77 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
79 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
80 ((((x)) % (4*1024*1024)) / (4*1024))
82 #define NR_SECTION_PAGE_TABLES (1024)
83 #define NR_SECTION_PAGE_ENTRIES (1024)
86 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
89 #define MM_VIRTMEM_GRANULARITY (64 * 1024) /* Although Microsoft says this isn't hardcoded anymore,
90 they won't be able to change it. Stuff depends on it */
92 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
95 * Additional flags for protection attributes
97 #define PAGE_WRITETHROUGH (1024)
98 #define PAGE_SYSTEM (2048)
99 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
103 PAGE_EXECUTE_READ | \
104 PAGE_EXECUTE_READWRITE | \
105 PAGE_EXECUTE_WRITECOPY | \
110 #define PAGE_IS_READABLE (PAGE_READONLY | \
113 PAGE_EXECUTE_READ | \
114 PAGE_EXECUTE_READWRITE | \
115 PAGE_EXECUTE_WRITECOPY)
117 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
119 PAGE_EXECUTE_READWRITE | \
120 PAGE_EXECUTE_WRITECOPY)
122 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
123 PAGE_EXECUTE_READ | \
124 PAGE_EXECUTE_READWRITE | \
125 PAGE_EXECUTE_WRITECOPY)
127 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
128 PAGE_EXECUTE_WRITECOPY)
132 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
133 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
137 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
138 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
140 #define SEC_PHYSICALMEMORY (0x80000000)
142 #define MM_PAGEFILE_SEGMENT (0x1)
143 #define MM_DATAFILE_SEGMENT (0x2)
145 typedef struct _MM_SECTION_SEGMENT
148 ULONG_PTR VirtualAddress
;
153 ULONG ReferenceCount
;
154 SECTION_PAGE_DIRECTORY PageDirectory
;
156 ULONG Characteristics
;
158 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
160 typedef struct _MM_IMAGE_SECTION_OBJECT
163 ULONG_PTR StackReserve
;
164 ULONG_PTR StackCommit
;
165 ULONG_PTR EntryPoint
;
167 ULONG ImageCharacteristics
;
168 USHORT MinorSubsystemVersion
;
169 USHORT MajorSubsystemVersion
;
173 PMM_SECTION_SEGMENT Segments
;
174 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
176 typedef struct _SECTION_OBJECT
180 LARGE_INTEGER MaximumSize
;
181 ULONG SectionPageProtection
;
182 ULONG AllocationAttributes
;
183 PFILE_OBJECT FileObject
;
186 PMM_IMAGE_SECTION_OBJECT ImageSection
;
187 PMM_SECTION_SEGMENT Segment
;
193 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
195 typedef struct _EPROCESS_QUOTA_ENTRY
{
200 } EPROCESS_QUOTA_ENTRY
, *PEPROCESS_QUOTA_ENTRY
;
202 typedef struct _EPROCESS_QUOTA_BLOCK
{
203 EPROCESS_QUOTA_ENTRY QuotaEntry
[3];
204 LIST_ENTRY QuotaList
;
205 ULONG ReferenceCount
;
207 } EPROCESS_QUOTA_BLOCK
, *PEPROCESS_QUOTA_BLOCK
;
213 typedef struct _PAGEFAULT_HISTORY
219 struct _PROCESS_WS_WATCH_INFORMATION WatchInfo
[1];
220 } PAGEFAULT_HISTORY
, *PPAGEFAULT_HISTORY
;
222 #endif /* __USE_W32API */
224 typedef struct _MMADDRESS_NODE
228 struct _MMADDRESS_NODE
*Parent
;
230 struct _MMADDRESS_NODE
*LeftChild
;
231 struct _MMADDRESS_NODE
*RightChild
;
234 } MMADDRESS_NODE
, *PMMADDRESS_NODE
;
236 typedef struct _MM_AVL_TABLE
238 MMADDRESS_NODE BalancedRoot
;
241 ULONG NumberGenericTableElements
:24;
244 } MM_AVL_TABLE
, *PMM_AVL_TABLE
;
246 typedef struct _MEMORY_AREA
248 PVOID StartingAddress
;
250 struct _MEMORY_AREA
*Parent
;
251 struct _MEMORY_AREA
*LeftChild
;
252 struct _MEMORY_AREA
*RightChild
;
256 BOOLEAN DeleteInProgress
;
262 SECTION_OBJECT
* Section
;
264 PMM_SECTION_SEGMENT Segment
;
265 BOOLEAN WriteCopyView
;
266 LIST_ENTRY RegionListHead
;
270 LIST_ENTRY RegionListHead
;
273 } MEMORY_AREA
, *PMEMORY_AREA
;
275 typedef struct _MADDRESS_SPACE
277 PMEMORY_AREA MemoryAreaRoot
;
280 struct _EPROCESS
* Process
;
281 PUSHORT PageTableRefCountTable
;
282 ULONG PageTableRefCountTableSize
;
283 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
285 typedef struct _KNODE
{
288 ULONG MmShiftedColor
;
290 SLIST_HEADER DeadStackList
;
291 SLIST_HEADER PfnDereferenceSListHead
;
292 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
302 extern PVOID EXPORTED MmSystemRangeStart
;
304 extern PVOID IMPORTED MmSystemRangeStart
;
307 #endif /* __USE_W32API */
313 ULONG NrReservedPages
;
318 ULONG PagingRequestsInLastMinute
;
319 ULONG PagingRequestsInLastFiveMinutes
;
320 ULONG PagingRequestsInLastFifteenMinutes
;
323 extern MM_STATS MmStats
;
325 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
327 #define MM_PAGEOP_PAGEIN (1)
328 #define MM_PAGEOP_PAGEOUT (2)
329 #define MM_PAGEOP_PAGESYNCH (3)
330 #define MM_PAGEOP_ACCESSFAULT (4)
332 typedef struct _MM_PAGEOP
334 /* Type of operation. */
336 /* Number of threads interested in this operation. */
337 ULONG ReferenceCount
;
338 /* Event that will be set when the operation is completed. */
339 KEVENT CompletionEvent
;
340 /* Status of the operation once it is completed. */
342 /* TRUE if the operation was abandoned. */
344 /* The memory area to be affected by the operation. */
347 struct _MM_PAGEOP
* Next
;
348 struct _ETHREAD
* Thread
;
350 * These fields are used to identify the operation if it is against a
351 * virtual memory area.
356 * These fields are used to identify the operation if it is against a
359 PMM_SECTION_SEGMENT Segment
;
361 } MM_PAGEOP
, *PMM_PAGEOP
;
366 #define MC_NPPOOL (3)
367 #define MC_MAXIMUM (4)
369 typedef struct _MM_MEMORY_CONSUMER
373 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
375 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
377 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
379 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
382 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
383 PVOID BaseAddress
, ULONG Length
,
384 ULONG OldType
, ULONG OldProtect
,
385 ULONG NewType
, ULONG NewProtect
);
387 typedef struct _MM_REGION
392 LIST_ENTRY RegionListEntry
;
393 } MM_REGION
, *PMM_REGION
;
395 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
396 PVOID Address
, PFN_TYPE Page
,
397 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
401 /* aspace.c ******************************************************************/
403 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
405 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
407 VOID
MmInitializeKernelAddressSpace(VOID
);
409 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
411 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
413 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
414 PMADDRESS_SPACE AddressSpace
);
416 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
418 /* marea.c *******************************************************************/
420 NTSTATUS INIT_FUNCTION
421 MmInitMemoryAreas(VOID
);
425 struct _EPROCESS
* Process
,
426 PMADDRESS_SPACE AddressSpace
,
431 PMEMORY_AREA
*Result
,
432 BOOLEAN FixedAddress
,
434 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
437 MmLocateMemoryAreaByAddress(
438 PMADDRESS_SPACE AddressSpace
,
443 PMADDRESS_SPACE AddressSpace
,
448 PMADDRESS_SPACE AddressSpace
,
449 PMEMORY_AREA MemoryArea
,
450 PMM_FREE_PAGE_FUNC FreePage
,
451 PVOID FreePageContext
);
454 MmFreeMemoryAreaByPtr(
455 PMADDRESS_SPACE AddressSpace
,
457 PMM_FREE_PAGE_FUNC FreePage
,
458 PVOID FreePageContext
);
461 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
464 MmLocateMemoryAreaByRegion(
465 PMADDRESS_SPACE AddressSpace
,
471 PMADDRESS_SPACE AddressSpace
,
473 ULONG_PTR Granularity
,
477 MmReleaseMemoryAreaIfDecommitted(
479 PMADDRESS_SPACE AddressSpace
,
482 /* npool.c *******************************************************************/
484 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
486 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
488 VOID
MiInitializeNonPagedPool(VOID
);
490 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
492 /* pool.c *******************************************************************/
497 IN POOL_TYPE PoolType
,
498 IN ULONG CurrentMaxQuota
,
499 OUT PULONG NewMaxQuota
502 /* mdl.c *********************************************************************/
504 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
506 /* mminit.c ******************************************************************/
508 VOID
MiShutdownMemoryManager(VOID
);
510 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
511 ULONG_PTR LastKernelPhysAddress
,
512 ULONG_PTR LastKernelAddress
,
513 PADDRESS_RANGE BIOSMemoryMap
,
514 ULONG AddressRangeCount
,
521 VOID
MiFreeInitMemory(VOID
);
523 VOID
MmInitializeMdlImplementation(VOID
);
525 /* pagefile.c ****************************************************************/
527 SWAPENTRY
MmAllocSwapPage(VOID
);
529 VOID
MmDereserveSwapPages(ULONG Nr
);
531 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
533 VOID
MmInitPagingFile(VOID
);
535 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
537 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
539 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
542 MmDumpToPagingFile(ULONG BugCode
,
543 ULONG BugCodeParameter1
,
544 ULONG BugCodeParameter2
,
545 ULONG BugCodeParameter3
,
546 ULONG BugCodeParameter4
,
547 struct _KTRAP_FRAME
* TrapFrame
);
549 BOOLEAN
MmIsAvailableSwapPage(VOID
);
551 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
553 /* process.c ****************************************************************/
557 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
558 IN PSECTION_OBJECT Section OPTIONAL
);
562 MmCreatePeb(PEPROCESS Process
);
566 MmCreateTeb(PEPROCESS Process
,
568 PINITIAL_TEB InitialTeb
);
572 MmDeleteTeb(PEPROCESS Process
,
575 /* i386/pfault.c *************************************************************/
577 NTSTATUS
MmPageFault(ULONG Cs
,
583 /* mm.c **********************************************************************/
585 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
589 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
593 /* anonmem.c *****************************************************************/
595 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
596 MEMORY_AREA
* MemoryArea
,
600 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
601 PMEMORY_AREA MemoryArea
,
603 struct _MM_PAGEOP
* PageOp
);
605 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
607 PMEMORY_BASIC_INFORMATION Info
,
608 PULONG ResultLength
);
610 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
612 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
613 PMEMORY_AREA MemoryArea
,
619 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
624 /* kmap.c ********************************************************************/
626 PVOID
ExAllocatePage(VOID
);
628 VOID
ExUnmapPage(PVOID Addr
);
630 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
632 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
634 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
636 /* memsafe.s *****************************************************************/
638 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
640 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
642 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
644 /* pageop.c ******************************************************************/
647 MmReleasePageOp(PMM_PAGEOP PageOp
);
650 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
651 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
653 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
654 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
656 MmInitializePageOp(VOID
);
658 /* process.c *****************************************************************/
662 MmCreateKernelStack(BOOLEAN GuiStack
);
666 MmDeleteKernelStack(PVOID Stack
,
669 /* balace.c ******************************************************************/
671 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
672 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
674 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
676 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
678 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
680 VOID
MiInitBalancerThread(VOID
);
682 VOID
MmRebalanceMemoryConsumers(VOID
);
684 /* rmap.c **************************************************************/
686 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
688 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
690 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
692 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
693 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
695 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
697 VOID
MmInitializeRmapList(VOID
);
699 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
701 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
703 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
705 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
707 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
709 /* freelist.c **********************************************************/
711 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
713 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
715 VOID
MmSetLRULastPage(PFN_TYPE Page
);
717 VOID
MmLockPage(PFN_TYPE Page
);
718 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
720 VOID
MmUnlockPage(PFN_TYPE Page
);
722 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
724 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
725 ULONG_PTR LastPhysKernelAddress
,
726 ULONG MemorySizeInPages
,
727 ULONG_PTR LastKernelBase
,
728 PADDRESS_RANGE BIOSMemoryMap
,
729 ULONG AddressRangeCount
);
731 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
732 PHYSICAL_ADDRESS LowestAcceptableAddress
,
733 PHYSICAL_ADDRESS HighestAcceptableAddress
,
736 NTSTATUS
MmInitZeroPageThread(VOID
);
738 /* i386/page.c *********************************************************/
740 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
742 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
744 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
746 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
751 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
753 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
759 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
765 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
767 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
771 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
774 VOID
MmInitGlobalKernelPageDirectory(VOID
);
776 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
778 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
780 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
782 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
784 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
786 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
788 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
790 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
792 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
794 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
795 PHYSICAL_ADDRESS LowestAddress
,
796 PHYSICAL_ADDRESS HighestAddress
,
800 VOID
MmDereferencePage(PFN_TYPE Page
);
802 VOID
MmReferencePage(PFN_TYPE Page
);
803 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
805 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
807 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
809 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
811 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
813 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
815 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
817 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
819 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
821 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
823 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
825 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
829 MmCopyMmInfo(struct _EPROCESS
* Src
,
830 struct _EPROCESS
* Dest
,
831 PPHYSICAL_ADDRESS DirectoryTableBase
);
833 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
835 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
837 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
843 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
845 VOID
MmMarkPageMapped(PFN_TYPE Page
);
847 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
849 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
851 VOID
MiInitPageDirectoryMap(VOID
);
853 ULONG
MiGetUserPageDirectoryCount(VOID
);
855 /* wset.c ********************************************************************/
857 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
859 /* cont.c ********************************************************************/
862 MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes
,
863 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
864 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
865 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
866 IN MEMORY_CACHING_TYPE CacheType OPTIONAL
,
869 /* region.c ************************************************************/
871 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
872 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
873 ULONG NewType
, ULONG NewProtect
,
874 PMM_ALTER_REGION_FUNC AlterFunc
);
876 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
879 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
880 PVOID
* RegionBaseAddress
);
882 /* section.c *****************************************************************/
885 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
888 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
890 PMEMORY_BASIC_INFORMATION Info
,
891 PULONG ResultLength
);
894 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
895 PMEMORY_AREA MemoryArea
,
902 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
907 NTSTATUS
MmInitSectionImplementation(VOID
);
910 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
912 /* FIXME: it should be in ddk/mmfuncs.h */
914 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
915 IN ACCESS_MASK DesiredAccess
,
916 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
917 IN PLARGE_INTEGER MaximumSize
,
918 IN ULONG SectionPageProtection
,
919 IN ULONG AllocationAttributes
,
920 IN HANDLE FileHandle OPTIONAL
,
921 IN PFILE_OBJECT File OPTIONAL
);
924 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
925 MEMORY_AREA
* MemoryArea
,
930 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
931 PMEMORY_AREA MemoryArea
,
933 struct _MM_PAGEOP
* PageOp
);
936 MmCreatePhysicalMemorySection(VOID
);
939 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
940 MEMORY_AREA
* MemoryArea
,
945 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
947 /* mpw.c *********************************************************************/
949 NTSTATUS
MmInitMpwThread(VOID
);
951 /* pager.c *******************************************************************/
953 BOOLEAN
MiIsPagerThread(VOID
);
955 VOID
MiStartPagerThread(VOID
);
957 VOID
MiStopPagerThread(VOID
);