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/arch/mm.h>
45 /* TYPES *********************************************************************/
47 extern ULONG MiFreeSwapPages
;
48 extern ULONG MiUsedSwapPages
;
49 extern ULONG MmPagedPoolSize
;
50 extern ULONG MmTotalPagedPoolQuota
;
51 extern ULONG MmTotalNonPagedPoolQuota
;
55 struct _MM_RMAP_ENTRY
;
57 typedef ULONG SWAPENTRY
;
59 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
61 #define MEMORY_AREA_INVALID (0)
62 #define MEMORY_AREA_SECTION_VIEW (1)
63 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
64 #define MEMORY_AREA_NO_CACHE (3)
65 #define MEMORY_AREA_IO_MAPPING (4)
66 #define MEMORY_AREA_SYSTEM (5)
67 #define MEMORY_AREA_MDL_MAPPING (7)
68 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
69 #define MEMORY_AREA_CACHE_SEGMENT (9)
70 #define MEMORY_AREA_SHARED_DATA (10)
71 #define MEMORY_AREA_KERNEL_STACK (11)
72 #define MEMORY_AREA_PAGED_POOL (12)
73 #define MEMORY_AREA_NO_ACCESS (13)
74 #define MEMORY_AREA_PEB_OR_TEB (14)
76 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
78 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
79 ((((x)) % (4*1024*1024)) / (4*1024))
81 #define NR_SECTION_PAGE_TABLES (1024)
82 #define NR_SECTION_PAGE_ENTRIES (1024)
85 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
88 #define MM_VIRTMEM_GRANULARITY (64 * 1024) /* Although Microsoft says this isn't hardcoded anymore,
89 they won't be able to change it. Stuff depends on it */
91 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
94 * Additional flags for protection attributes
96 #define PAGE_WRITETHROUGH (1024)
97 #define PAGE_SYSTEM (2048)
98 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
102 PAGE_EXECUTE_READ | \
103 PAGE_EXECUTE_READWRITE | \
104 PAGE_EXECUTE_WRITECOPY | \
109 #define PAGE_IS_READABLE (PAGE_READONLY | \
112 PAGE_EXECUTE_READ | \
113 PAGE_EXECUTE_READWRITE | \
114 PAGE_EXECUTE_WRITECOPY)
116 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
118 PAGE_EXECUTE_READWRITE | \
119 PAGE_EXECUTE_WRITECOPY)
121 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
122 PAGE_EXECUTE_READ | \
123 PAGE_EXECUTE_READWRITE | \
124 PAGE_EXECUTE_WRITECOPY)
126 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
127 PAGE_EXECUTE_WRITECOPY)
131 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
132 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
136 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
137 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
139 #define SEC_PHYSICALMEMORY (0x80000000)
141 #define MM_PAGEFILE_SEGMENT (0x1)
142 #define MM_DATAFILE_SEGMENT (0x2)
144 typedef struct _MM_SECTION_SEGMENT
147 ULONG_PTR VirtualAddress
;
152 ULONG ReferenceCount
;
153 SECTION_PAGE_DIRECTORY PageDirectory
;
155 ULONG Characteristics
;
157 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
159 typedef struct _MM_IMAGE_SECTION_OBJECT
162 ULONG_PTR StackReserve
;
163 ULONG_PTR StackCommit
;
164 ULONG_PTR EntryPoint
;
166 ULONG ImageCharacteristics
;
167 USHORT MinorSubsystemVersion
;
168 USHORT MajorSubsystemVersion
;
172 PMM_SECTION_SEGMENT Segments
;
173 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
175 typedef struct _SECTION_OBJECT
179 LARGE_INTEGER MaximumSize
;
180 ULONG SectionPageProtection
;
181 ULONG AllocationAttributes
;
182 PFILE_OBJECT FileObject
;
185 PMM_IMAGE_SECTION_OBJECT ImageSection
;
186 PMM_SECTION_SEGMENT Segment
;
192 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
194 typedef struct _EPROCESS_QUOTA_ENTRY
{
199 } EPROCESS_QUOTA_ENTRY
, *PEPROCESS_QUOTA_ENTRY
;
201 typedef struct _EPROCESS_QUOTA_BLOCK
{
202 EPROCESS_QUOTA_ENTRY QuotaEntry
[3];
203 LIST_ENTRY QuotaList
;
204 ULONG ReferenceCount
;
206 } EPROCESS_QUOTA_BLOCK
, *PEPROCESS_QUOTA_BLOCK
;
212 typedef struct _PAGEFAULT_HISTORY
218 struct _PROCESS_WS_WATCH_INFORMATION WatchInfo
[1];
219 } PAGEFAULT_HISTORY
, *PPAGEFAULT_HISTORY
;
221 #endif /* __USE_W32API */
223 typedef struct _MMADDRESS_NODE
227 struct _MMADDRESS_NODE
*Parent
;
229 struct _MMADDRESS_NODE
*LeftChild
;
230 struct _MMADDRESS_NODE
*RightChild
;
233 } MMADDRESS_NODE
, *PMMADDRESS_NODE
;
235 typedef struct _MM_AVL_TABLE
237 MMADDRESS_NODE BalancedRoot
;
240 ULONG NumberGenericTableElements
:24;
243 } MM_AVL_TABLE
, *PMM_AVL_TABLE
;
245 typedef struct _MEMORY_AREA
247 PVOID StartingAddress
;
249 struct _MEMORY_AREA
*Parent
;
250 struct _MEMORY_AREA
*LeftChild
;
251 struct _MEMORY_AREA
*RightChild
;
255 BOOLEAN DeleteInProgress
;
261 SECTION_OBJECT
* Section
;
263 PMM_SECTION_SEGMENT Segment
;
264 BOOLEAN WriteCopyView
;
265 LIST_ENTRY RegionListHead
;
269 LIST_ENTRY RegionListHead
;
272 } MEMORY_AREA
, *PMEMORY_AREA
;
274 typedef struct _MADDRESS_SPACE
276 PMEMORY_AREA MemoryAreaRoot
;
279 struct _EPROCESS
* Process
;
280 PUSHORT PageTableRefCountTable
;
281 ULONG PageTableRefCountTableSize
;
282 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
284 typedef struct _KNODE
{
287 ULONG MmShiftedColor
;
289 SLIST_HEADER DeadStackList
;
290 SLIST_HEADER PfnDereferenceSListHead
;
291 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
301 extern PVOID EXPORTED MmSystemRangeStart
;
303 extern PVOID IMPORTED MmSystemRangeStart
;
306 #endif /* __USE_W32API */
312 ULONG NrReservedPages
;
317 ULONG PagingRequestsInLastMinute
;
318 ULONG PagingRequestsInLastFiveMinutes
;
319 ULONG PagingRequestsInLastFifteenMinutes
;
322 extern MM_STATS MmStats
;
324 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
326 #define MM_CORE_DUMP_TYPE_NONE (0x0)
327 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
328 #define MM_CORE_DUMP_TYPE_FULL (0x2)
330 #define MM_PAGEOP_PAGEIN (1)
331 #define MM_PAGEOP_PAGEOUT (2)
332 #define MM_PAGEOP_PAGESYNCH (3)
333 #define MM_PAGEOP_ACCESSFAULT (4)
335 typedef struct _MM_PAGEOP
337 /* Type of operation. */
339 /* Number of threads interested in this operation. */
340 ULONG ReferenceCount
;
341 /* Event that will be set when the operation is completed. */
342 KEVENT CompletionEvent
;
343 /* Status of the operation once it is completed. */
345 /* TRUE if the operation was abandoned. */
347 /* The memory area to be affected by the operation. */
350 struct _MM_PAGEOP
* Next
;
351 struct _ETHREAD
* Thread
;
353 * These fields are used to identify the operation if it is against a
354 * virtual memory area.
359 * These fields are used to identify the operation if it is against a
362 PMM_SECTION_SEGMENT Segment
;
364 } MM_PAGEOP
, *PMM_PAGEOP
;
369 #define MC_NPPOOL (3)
370 #define MC_MAXIMUM (4)
372 typedef struct _MM_MEMORY_CONSUMER
376 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
378 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
380 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
382 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
385 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
386 PVOID BaseAddress
, ULONG Length
,
387 ULONG OldType
, ULONG OldProtect
,
388 ULONG NewType
, ULONG NewProtect
);
390 typedef struct _MM_REGION
395 LIST_ENTRY RegionListEntry
;
396 } MM_REGION
, *PMM_REGION
;
398 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
399 PVOID Address
, PFN_TYPE Page
,
400 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
404 /* aspace.c ******************************************************************/
406 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
408 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
410 VOID
MmInitializeKernelAddressSpace(VOID
);
412 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
414 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
416 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
417 PMADDRESS_SPACE AddressSpace
);
419 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
421 /* marea.c *******************************************************************/
423 NTSTATUS INIT_FUNCTION
424 MmInitMemoryAreas(VOID
);
428 struct _EPROCESS
* Process
,
429 PMADDRESS_SPACE AddressSpace
,
434 PMEMORY_AREA
*Result
,
435 BOOLEAN FixedAddress
,
437 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
440 MmLocateMemoryAreaByAddress(
441 PMADDRESS_SPACE AddressSpace
,
446 PMADDRESS_SPACE AddressSpace
,
451 PMADDRESS_SPACE AddressSpace
,
452 PMEMORY_AREA MemoryArea
,
453 PMM_FREE_PAGE_FUNC FreePage
,
454 PVOID FreePageContext
);
457 MmFreeMemoryAreaByPtr(
458 PMADDRESS_SPACE AddressSpace
,
460 PMM_FREE_PAGE_FUNC FreePage
,
461 PVOID FreePageContext
);
464 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
467 MmLocateMemoryAreaByRegion(
468 PMADDRESS_SPACE AddressSpace
,
474 PMADDRESS_SPACE AddressSpace
,
476 ULONG_PTR Granularity
,
480 MmReleaseMemoryAreaIfDecommitted(
482 PMADDRESS_SPACE AddressSpace
,
485 /* npool.c *******************************************************************/
487 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
489 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
491 VOID
MiInitializeNonPagedPool(VOID
);
493 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
495 /* pool.c *******************************************************************/
500 IN POOL_TYPE PoolType
,
501 IN ULONG CurrentMaxQuota
,
502 OUT PULONG NewMaxQuota
505 /* mdl.c *********************************************************************/
507 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
509 /* mminit.c ******************************************************************/
511 VOID
MiShutdownMemoryManager(VOID
);
513 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
514 ULONG_PTR LastKernelPhysAddress
,
515 ULONG_PTR LastKernelAddress
,
516 PADDRESS_RANGE BIOSMemoryMap
,
517 ULONG AddressRangeCount
,
524 VOID
MiFreeInitMemory(VOID
);
526 VOID
MmInitializeMdlImplementation(VOID
);
528 /* pagefile.c ****************************************************************/
530 SWAPENTRY
MmAllocSwapPage(VOID
);
532 VOID
MmDereserveSwapPages(ULONG Nr
);
534 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
536 VOID
MmInitPagingFile(VOID
);
538 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
540 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
542 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
545 MmDumpToPagingFile(ULONG BugCode
,
546 ULONG BugCodeParameter1
,
547 ULONG BugCodeParameter2
,
548 ULONG BugCodeParameter3
,
549 ULONG BugCodeParameter4
,
550 struct _KTRAP_FRAME
* TrapFrame
);
552 BOOLEAN
MmIsAvailableSwapPage(VOID
);
554 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
556 /* process.c ****************************************************************/
560 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
561 IN PSECTION_OBJECT Section OPTIONAL
);
565 MmCreatePeb(PEPROCESS Process
);
569 MmCreateTeb(PEPROCESS Process
,
571 PINITIAL_TEB InitialTeb
);
575 MmDeleteTeb(PEPROCESS Process
,
578 /* i386/pfault.c *************************************************************/
580 NTSTATUS
MmPageFault(ULONG Cs
,
586 /* mm.c **********************************************************************/
588 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
592 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
596 /* anonmem.c *****************************************************************/
598 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
599 MEMORY_AREA
* MemoryArea
,
603 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
604 PMEMORY_AREA MemoryArea
,
606 struct _MM_PAGEOP
* PageOp
);
608 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
610 PMEMORY_BASIC_INFORMATION Info
,
611 PULONG ResultLength
);
613 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
615 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
616 PMEMORY_AREA MemoryArea
,
622 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
627 /* kmap.c ********************************************************************/
629 PVOID
ExAllocatePage(VOID
);
631 VOID
ExUnmapPage(PVOID Addr
);
633 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
635 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
637 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
639 /* memsafe.s *****************************************************************/
641 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
643 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
645 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
647 /* pageop.c ******************************************************************/
650 MmReleasePageOp(PMM_PAGEOP PageOp
);
653 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
654 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
656 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
657 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
659 MmInitializePageOp(VOID
);
661 /* process.c *****************************************************************/
665 MmCreateKernelStack(BOOLEAN GuiStack
);
669 MmDeleteKernelStack(PVOID Stack
,
672 /* balace.c ******************************************************************/
674 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
675 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
677 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
679 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
681 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
683 VOID
MiInitBalancerThread(VOID
);
685 VOID
MmRebalanceMemoryConsumers(VOID
);
687 /* rmap.c **************************************************************/
689 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
691 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
693 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
695 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
696 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
698 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
700 VOID
MmInitializeRmapList(VOID
);
702 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
704 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
706 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
708 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
710 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
712 /* freelist.c **********************************************************/
714 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
716 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
718 VOID
MmSetLRULastPage(PFN_TYPE Page
);
720 VOID
MmLockPage(PFN_TYPE Page
);
721 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
723 VOID
MmUnlockPage(PFN_TYPE Page
);
725 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
727 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
728 ULONG_PTR LastPhysKernelAddress
,
729 ULONG MemorySizeInPages
,
730 ULONG_PTR LastKernelBase
,
731 PADDRESS_RANGE BIOSMemoryMap
,
732 ULONG AddressRangeCount
);
734 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
735 PHYSICAL_ADDRESS LowestAcceptableAddress
,
736 PHYSICAL_ADDRESS HighestAcceptableAddress
,
739 NTSTATUS
MmInitZeroPageThread(VOID
);
741 /* i386/page.c *********************************************************/
743 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
745 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
747 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
749 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
754 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
756 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
762 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
768 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
770 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
774 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
777 VOID
MmInitGlobalKernelPageDirectory(VOID
);
779 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
781 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
783 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
785 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
787 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
789 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
791 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
793 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
795 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
797 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
798 PHYSICAL_ADDRESS LowestAddress
,
799 PHYSICAL_ADDRESS HighestAddress
,
803 VOID
MmDereferencePage(PFN_TYPE Page
);
805 VOID
MmReferencePage(PFN_TYPE Page
);
806 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
808 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
810 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
812 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
814 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
816 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
818 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
820 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
822 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
824 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
826 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
828 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
832 MmCopyMmInfo(struct _EPROCESS
* Src
,
833 struct _EPROCESS
* Dest
,
834 PPHYSICAL_ADDRESS DirectoryTableBase
);
836 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
838 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
840 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
846 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
848 VOID
MmMarkPageMapped(PFN_TYPE Page
);
850 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
852 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
854 VOID
MiInitPageDirectoryMap(VOID
);
856 ULONG
MiGetUserPageDirectoryCount(VOID
);
858 /* wset.c ********************************************************************/
860 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
862 /* cont.c ********************************************************************/
865 MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes
,
866 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
867 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
868 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
869 IN MEMORY_CACHING_TYPE CacheType OPTIONAL
,
872 /* region.c ************************************************************/
874 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
875 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
876 ULONG NewType
, ULONG NewProtect
,
877 PMM_ALTER_REGION_FUNC AlterFunc
);
879 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
882 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
883 PVOID
* RegionBaseAddress
);
885 /* section.c *****************************************************************/
888 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
891 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
893 PMEMORY_BASIC_INFORMATION Info
,
894 PULONG ResultLength
);
897 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
898 PMEMORY_AREA MemoryArea
,
905 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
910 NTSTATUS
MmInitSectionImplementation(VOID
);
913 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
915 /* FIXME: it should be in ddk/mmfuncs.h */
917 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
918 IN ACCESS_MASK DesiredAccess
,
919 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
920 IN PLARGE_INTEGER MaximumSize
,
921 IN ULONG SectionPageProtection
,
922 IN ULONG AllocationAttributes
,
923 IN HANDLE FileHandle OPTIONAL
,
924 IN PFILE_OBJECT File OPTIONAL
);
927 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
928 MEMORY_AREA
* MemoryArea
,
933 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
934 PMEMORY_AREA MemoryArea
,
936 struct _MM_PAGEOP
* PageOp
);
939 MmCreatePhysicalMemorySection(VOID
);
942 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
943 MEMORY_AREA
* MemoryArea
,
948 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
950 /* mpw.c *********************************************************************/
952 NTSTATUS
MmInitMpwThread(VOID
);
954 /* pager.c *******************************************************************/
956 BOOLEAN
MiIsPagerThread(VOID
);
958 VOID
MiStartPagerThread(VOID
);
960 VOID
MiStopPagerThread(VOID
);