1 #ifndef __INCLUDE_INTERNAL_MM_H
2 #define __INCLUDE_INTERNAL_MM_H
4 #include <internal/arch/mm.h>
6 /* TYPES *********************************************************************/
10 extern ULONG MiFreeSwapPages
;
11 extern ULONG MiUsedSwapPages
;
12 extern ULONG MmPagedPoolSize
;
13 extern ULONG MmTotalPagedPoolQuota
;
14 extern ULONG MmTotalNonPagedPoolQuota
;
15 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
16 extern ULONG MmNumberOfPhysicalPages
;
18 extern PVOID MmPagedPoolBase
;
19 extern ULONG MmPagedPoolSize
;
21 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor
;
22 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg
;
23 extern ULONG MmHighestPhysicalPage
;
24 extern PVOID MmPfnDatabase
;
28 struct _MM_RMAP_ENTRY
;
30 typedef ULONG SWAPENTRY
;
31 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
33 #define MEMORY_AREA_INVALID (0)
34 #define MEMORY_AREA_SECTION_VIEW (1)
35 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
36 #define MEMORY_AREA_NO_CACHE (3)
37 #define MEMORY_AREA_IO_MAPPING (4)
38 #define MEMORY_AREA_SYSTEM (5)
39 #define MEMORY_AREA_MDL_MAPPING (7)
40 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
41 #define MEMORY_AREA_CACHE_SEGMENT (9)
42 #define MEMORY_AREA_SHARED_DATA (10)
43 #define MEMORY_AREA_KERNEL_STACK (11)
44 #define MEMORY_AREA_PAGED_POOL (12)
45 #define MEMORY_AREA_NO_ACCESS (13)
46 #define MEMORY_AREA_PEB_OR_TEB (14)
48 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
50 #define MM_CORE_DUMP_TYPE_NONE (0x0)
51 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
52 #define MM_CORE_DUMP_TYPE_FULL (0x2)
54 #define MM_PAGEOP_PAGEIN (1)
55 #define MM_PAGEOP_PAGEOUT (2)
56 #define MM_PAGEOP_PAGESYNCH (3)
57 #define MM_PAGEOP_ACCESSFAULT (4)
59 /* Number of list heads to use */
60 #define MI_FREE_POOL_LISTS 4
62 /* Signature of free pool blocks */
63 #define MM_FREE_POOL_TAG TAG('F', 'r', 'p', 'l')
65 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
68 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
69 ((((x)) % (4*1024*1024)) / (4*1024))
71 #define NR_SECTION_PAGE_TABLES 1024
72 #define NR_SECTION_PAGE_ENTRIES 1024
74 #define TEB_BASE 0x7FFDE000
76 /* Although Microsoft says this isn't hardcoded anymore,
77 they won't be able to change it. Stuff depends on it */
78 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
80 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
83 * Additional flags for protection attributes
85 #define PAGE_WRITETHROUGH (1024)
86 #define PAGE_SYSTEM (2048)
88 #define SEC_PHYSICALMEMORY (0x80000000)
90 #define MM_PAGEFILE_SEGMENT (0x1)
91 #define MM_DATAFILE_SEGMENT (0x2)
97 #define MC_MAXIMUM (4)
99 #define PAGED_POOL_MASK 1
100 #define MUST_SUCCEED_POOL_MASK 2
101 #define CACHE_ALIGNED_POOL_MASK 4
102 #define QUOTA_POOL_MASK 8
103 #define SESSION_POOL_MASK 32
104 #define VERIFIER_POOL_MASK 64
106 #define MM_PAGED_POOL_SIZE (100*1024*1024)
107 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
110 * Paged and non-paged pools are 8-byte aligned
112 #define MM_POOL_ALIGNMENT 8
115 * Maximum size of the kmalloc area (this is totally arbitary)
117 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
118 #define MM_KERNEL_MAP_BASE (0xf0c00000)
121 * FIXME - different architectures have different cache line sizes...
123 #define MM_CACHE_LINE_SIZE 32
125 #define MM_ROUND_UP(x,s) \
126 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
128 #define MM_ROUND_DOWN(x,s) \
129 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
131 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
136 PAGE_EXECUTE_READ | \
137 PAGE_EXECUTE_READWRITE | \
138 PAGE_EXECUTE_WRITECOPY | \
143 #define PAGE_IS_READABLE \
147 PAGE_EXECUTE_READ | \
148 PAGE_EXECUTE_READWRITE | \
149 PAGE_EXECUTE_WRITECOPY)
151 #define PAGE_IS_WRITABLE \
154 PAGE_EXECUTE_READWRITE | \
155 PAGE_EXECUTE_WRITECOPY)
157 #define PAGE_IS_EXECUTABLE \
159 PAGE_EXECUTE_READ | \
160 PAGE_EXECUTE_READWRITE | \
161 PAGE_EXECUTE_WRITECOPY)
163 #define PAGE_IS_WRITECOPY \
165 PAGE_EXECUTE_WRITECOPY)
168 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
169 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
171 #define InterlockedExchangePte(PointerPte, Value) \
172 InterlockedExchange((PLONG)(PointerPte), Value)
176 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
177 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
181 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
182 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
184 typedef struct _MM_SECTION_SEGMENT
186 LONG FileOffset
; /* start offset into the file for image sections */
187 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
188 ULONG RawLength
; /* length of the segment which is part of the mapped file */
189 ULONG Length
; /* absolute length of the segment */
191 FAST_MUTEX Lock
; /* lock which protects the page directory */
192 ULONG ReferenceCount
;
193 SECTION_PAGE_DIRECTORY PageDirectory
;
195 ULONG Characteristics
;
197 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
199 typedef struct _MM_IMAGE_SECTION_OBJECT
202 ULONG_PTR StackReserve
;
203 ULONG_PTR StackCommit
;
204 ULONG_PTR EntryPoint
;
206 USHORT ImageCharacteristics
;
207 USHORT MinorSubsystemVersion
;
208 USHORT MajorSubsystemVersion
;
213 PMM_SECTION_SEGMENT Segments
;
214 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
216 typedef struct _ROS_SECTION_OBJECT
220 LARGE_INTEGER MaximumSize
;
221 ULONG SectionPageProtection
;
222 ULONG AllocationAttributes
;
223 PFILE_OBJECT FileObject
;
226 PMM_IMAGE_SECTION_OBJECT ImageSection
;
227 PMM_SECTION_SEGMENT Segment
;
229 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
231 typedef struct _MEMORY_AREA
233 PVOID StartingAddress
;
235 struct _MEMORY_AREA
*Parent
;
236 struct _MEMORY_AREA
*LeftChild
;
237 struct _MEMORY_AREA
*RightChild
;
241 BOOLEAN DeleteInProgress
;
247 ROS_SECTION_OBJECT
* Section
;
249 PMM_SECTION_SEGMENT Segment
;
250 BOOLEAN WriteCopyView
;
251 LIST_ENTRY RegionListHead
;
255 LIST_ENTRY RegionListHead
;
258 } MEMORY_AREA
, *PMEMORY_AREA
;
268 ULONG PagingRequestsInLastMinute
;
269 ULONG PagingRequestsInLastFiveMinutes
;
270 ULONG PagingRequestsInLastFifteenMinutes
;
273 typedef struct _PHYSICAL_PAGE
282 ULONG StartOfAllocation
: 1;
283 ULONG EndOfAllocation
: 1;
289 LIST_ENTRY ListEntry
;
290 ULONG ReferenceCount
;
291 SWAPENTRY SavedSwapEntry
;
294 struct _MM_RMAP_ENTRY
* RmapListHead
;
296 PHYSICAL_PAGE
, *PPHYSICAL_PAGE
;
298 extern MM_STATS MmStats
;
300 typedef struct _MM_PAGEOP
302 /* Type of operation. */
304 /* Number of threads interested in this operation. */
305 ULONG ReferenceCount
;
306 /* Event that will be set when the operation is completed. */
307 KEVENT CompletionEvent
;
308 /* Status of the operation once it is completed. */
310 /* TRUE if the operation was abandoned. */
312 /* The memory area to be affected by the operation. */
315 struct _MM_PAGEOP
* Next
;
316 struct _ETHREAD
* Thread
;
318 * These fields are used to identify the operation if it is against a
319 * virtual memory area.
324 * These fields are used to identify the operation if it is against a
327 PMM_SECTION_SEGMENT Segment
;
329 } MM_PAGEOP
, *PMM_PAGEOP
;
331 typedef struct _MM_MEMORY_CONSUMER
335 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
336 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
338 typedef struct _MM_REGION
343 LIST_ENTRY RegionListEntry
;
344 } MM_REGION
, *PMM_REGION
;
346 /* Entry describing free pool memory */
347 typedef struct _MMFREE_POOL_ENTRY
352 struct _MMFREE_POOL_ENTRY
*Owner
;
353 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
355 /* Paged pool information */
356 typedef struct _MM_PAGED_POOL_INFO
358 PRTL_BITMAP PagedPoolAllocationMap
;
359 PRTL_BITMAP EndOfPagedPoolBitmap
;
360 PMMPTE FirstPteForPagedPool
;
361 PMMPTE LastPteForPagedPool
;
362 PMMPTE NextPdeForPagedPoolExpansion
;
364 SIZE_T PagedPoolCommit
;
365 SIZE_T AllocatedPagedPool
;
366 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
368 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
371 (*PMM_ALTER_REGION_FUNC
)(
372 PMM_AVL_TABLE AddressSpace
,
382 (*PMM_FREE_PAGE_FUNC
)(
384 PMEMORY_AREA MemoryArea
,
391 /* marea.c *******************************************************************/
396 PMM_AVL_TABLE AddressSpace
,
401 PMEMORY_AREA
*Result
,
402 BOOLEAN FixedAddress
,
403 ULONG AllocationFlags
,
404 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
409 MmLocateMemoryAreaByAddress(
410 PMM_AVL_TABLE AddressSpace
,
417 PMM_AVL_TABLE AddressSpace
,
424 PMM_AVL_TABLE AddressSpace
,
425 PMEMORY_AREA MemoryArea
,
426 PMM_FREE_PAGE_FUNC FreePage
,
427 PVOID FreePageContext
432 MmFreeMemoryAreaByPtr(
433 PMM_AVL_TABLE AddressSpace
,
435 PMM_FREE_PAGE_FUNC FreePage
,
436 PVOID FreePageContext
441 MmDumpMemoryAreas(PMM_AVL_TABLE AddressSpace
);
445 MmLocateMemoryAreaByRegion(
446 PMM_AVL_TABLE AddressSpace
,
454 PMM_AVL_TABLE AddressSpace
,
456 ULONG_PTR Granularity
,
462 MmReleaseMemoryAreaIfDecommitted(
463 struct _EPROCESS
*Process
,
464 PMM_AVL_TABLE AddressSpace
,
470 MmMapMemoryArea(PVOID BaseAddress
,
475 /* npool.c *******************************************************************/
479 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
483 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
487 MiInitializeNonPagedPool(VOID
);
492 IN POOL_TYPE PoolType
,
493 IN SIZE_T SizeInBytes
499 IN PVOID VirtualAddress
505 IN PVOID StartingAddress
515 /* pool.c *******************************************************************/
519 ExAllocateNonPagedPoolWithTag(
528 ExAllocatePagedPoolWithTag(
536 ExFreeNonPagedPool(PVOID block
);
540 ExFreePagedPool(IN PVOID Block
);
544 MmInitializePagedPool(VOID
);
548 MiAllocateSpecialPool(
549 IN POOL_TYPE PoolType
,
550 IN SIZE_T NumberOfBytes
,
558 IN POOL_TYPE PoolType
,
559 IN ULONG CurrentMaxQuota
,
560 OUT PULONG NewMaxQuota
563 /* mdl.c *********************************************************************/
572 /* mminit.c ******************************************************************/
576 MiShutdownMemoryManager(VOID
);
586 MmInitSystem(IN ULONG Phase
,
587 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
591 MiFreeInitMemory(VOID
);
595 MmInitializeMdlImplementation(VOID
);
597 /* pagefile.c ****************************************************************/
601 MmAllocSwapPage(VOID
);
605 MmDereserveSwapPages(ULONG Nr
);
609 MmFreeSwapPage(SWAPENTRY Entry
);
613 MmInitPagingFile(VOID
);
624 MmReserveSwapPages(ULONG Nr
);
637 ULONG BugCodeParameter1
,
638 ULONG BugCodeParameter2
,
639 ULONG BugCodeParameter3
,
640 ULONG BugCodeParameter4
,
641 struct _KTRAP_FRAME
* TrapFrame
646 MmIsAvailableSwapPage(VOID
);
650 MmShowOutOfSpaceMessagePagingFile(VOID
);
652 /* process.c ****************************************************************/
656 MmInitializeProcessAddressSpace(
657 IN PEPROCESS Process
,
658 IN PEPROCESS Clone OPTIONAL
,
659 IN PVOID Section OPTIONAL
,
661 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
666 MmCreatePeb(struct _EPROCESS
*Process
);
671 struct _EPROCESS
*Process
,
673 PINITIAL_TEB InitialTeb
679 struct _EPROCESS
*Process
,
685 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
689 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
693 MmGetSessionLocaleId(VOID
);
697 MmSetMemoryPriorityProcess(
698 IN PEPROCESS Process
,
699 IN UCHAR MemoryPriority
702 /* i386/pfault.c *************************************************************/
714 /* mm.c **********************************************************************/
719 IN BOOLEAN StoreInstruction
,
721 IN KPROCESSOR_MODE Mode
,
722 IN PVOID TrapInformation
725 /* anonmem.c *****************************************************************/
729 MmNotPresentFaultVirtualMemory(
730 PMM_AVL_TABLE AddressSpace
,
731 MEMORY_AREA
* MemoryArea
,
738 MmPageOutVirtualMemory(
739 PMM_AVL_TABLE AddressSpace
,
740 PMEMORY_AREA MemoryArea
,
742 struct _MM_PAGEOP
* PageOp
748 PMEMORY_AREA MemoryArea
,
750 PMEMORY_BASIC_INFORMATION Info
,
757 struct _EPROCESS
* Process
,
758 PMEMORY_AREA MemoryArea
764 PMM_AVL_TABLE AddressSpace
,
765 PMEMORY_AREA MemoryArea
,
774 MmWritePageVirtualMemory(
775 PMM_AVL_TABLE AddressSpace
,
781 /* kmap.c ********************************************************************/
785 ExAllocatePage(VOID
);
789 ExUnmapPage(PVOID Addr
);
793 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
804 MiZeroPage(PFN_TYPE Page
);
806 /* memsafe.s *****************************************************************/
810 MmSafeReadPtr(PVOID Source
);
812 /* pageop.c ******************************************************************/
816 MmReleasePageOp(PMM_PAGEOP PageOp
);
824 PMM_SECTION_SEGMENT Segment
,
836 PMM_SECTION_SEGMENT Segment
,
842 MmInitializePageOp(VOID
);
844 /* process.c *****************************************************************/
848 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
852 MmDeleteKernelStack(PVOID Stack
,
855 /* balace.c ******************************************************************/
859 MmInitializeMemoryConsumer(
861 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
866 MmInitializeBalancer(
867 ULONG NrAvailablePages
,
873 MmReleasePageMemoryConsumer(
880 MmRequestPageMemoryConsumer(
883 PPFN_TYPE AllocatedPage
888 MiInitBalancerThread(VOID
);
892 MmRebalanceMemoryConsumers(VOID
);
894 /* rmap.c **************************************************************/
898 MmSetRmapListHeadPage(
900 struct _MM_RMAP_ENTRY
* ListHead
903 struct _MM_RMAP_ENTRY
*
905 MmGetRmapListHeadPage(PFN_TYPE Page
);
911 struct _EPROCESS
*Process
,
920 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
927 struct _EPROCESS
*Process
,
933 MmInitializeRmapList(VOID
);
937 MmSetCleanAllRmaps(PFN_TYPE Page
);
941 MmSetDirtyAllRmaps(PFN_TYPE Page
);
945 MmIsDirtyPageRmap(PFN_TYPE Page
);
949 MmWritePagePhysicalAddress(PFN_TYPE Page
);
953 MmPageOutPhysicalAddress(PFN_TYPE Page
);
955 /* freelist.c **********************************************************/
957 #define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
961 MiGetPfnEntry(IN PFN_TYPE Pfn
)
964 extern PPHYSICAL_PAGE MmPageArray
;
965 extern ULONG MmPageArraySize
;
967 /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
968 UNREFERENCED_PARAMETER(MmPageArraySize
);
970 /* Make sure the PFN number is valid */
971 ASSERT(Pfn
<= MmPageArraySize
);
974 Page
= &MmPageArray
[Pfn
];
976 /* Make sure it's valid */
985 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
989 MmGetLRUFirstUserPage(VOID
);
993 MmInsertLRULastUserPage(PFN_TYPE Page
);
997 MmRemoveLRUUserPage(PFN_TYPE Page
);
1001 MmLockPage(PFN_TYPE Page
);
1005 MmLockPageUnsafe(PFN_TYPE Page
);
1009 MmUnlockPage(PFN_TYPE Page
);
1013 MmGetLockCountPage(PFN_TYPE Page
);
1019 MmAcquirePageListLock()
1021 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
1027 MmReleasePageListLock(KIRQL oldIrql
)
1029 KeReleaseQueuedSpinLock(LockQueuePfnLock
, oldIrql
);
1034 MmInitializePageList(
1040 MmGetContinuousPages(
1041 ULONG NumberOfBytes
,
1042 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1043 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1044 PHYSICAL_ADDRESS BoundaryAddressMultiple
1049 MmZeroPageThreadMain(
1053 /* i386/page.c *********************************************************/
1057 MmCreateHyperspaceMapping(PFN_TYPE Page
);
1061 MmDeleteHyperspaceMapping(PVOID Address
);
1065 MmCreateVirtualMappingForKernel(
1074 MmCommitPagedPoolAddress(
1081 MmCreateVirtualMapping(
1082 struct _EPROCESS
* Process
,
1091 MmCreateVirtualMappingUnsafe(
1092 struct _EPROCESS
* Process
,
1102 struct _EPROCESS
* Process
,
1108 struct _EPROCESS
* Process
,
1116 struct _EPROCESS
* Process
,
1122 MmInitGlobalKernelPageDirectory(VOID
);
1126 MmDisableVirtualMapping(
1127 struct _EPROCESS
*Process
,
1135 MmEnableVirtualMapping(
1136 struct _EPROCESS
*Process
,
1142 MmRawDeleteVirtualMapping(PVOID Address
);
1146 MmDeletePageFileMapping(
1147 struct _EPROCESS
*Process
,
1149 SWAPENTRY
* SwapEntry
1154 MmCreatePageFileMapping(
1155 struct _EPROCESS
*Process
,
1163 struct _EPROCESS
*Process
,
1169 MmTransferOwnershipPage(
1177 struct _EPROCESS
*Process
,
1185 SWAPENTRY SavedSwapEntry
1190 MmAllocPagesSpecifyRange(
1192 PHYSICAL_ADDRESS LowestAddress
,
1193 PHYSICAL_ADDRESS HighestAddress
,
1194 ULONG NumberOfPages
,
1200 MmDereferencePage(PFN_TYPE Page
);
1204 MmReferencePage(PFN_TYPE Page
);
1208 MmReferencePageUnsafe(PFN_TYPE Page
);
1212 MmGetReferenceCountPage(PFN_TYPE Page
);
1216 MmIsPageInUse(PFN_TYPE Page
);
1226 MmGetFlagsPage(PFN_TYPE Page
);
1230 MmSetSavedSwapEntryPage(
1232 SWAPENTRY SavedSwapEntry
);
1236 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1241 struct _EPROCESS
*Process
,
1247 MmCreatePageTable(PVOID PAddress
);
1252 struct _EPROCESS
*Process
,
1259 struct _EPROCESS
*Process
,
1265 MmCreateProcessAddressSpace(
1268 IN PULONG DirectoryTableBase
1273 MmInitializeHandBuiltProcess(
1274 IN PEPROCESS Process
,
1275 IN PULONG DirectoryTableBase
1281 MmInitializeHandBuiltProcess2(
1282 IN PEPROCESS Process
1287 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1291 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1295 MmDeleteVirtualMapping(
1296 struct _EPROCESS
*Process
,
1306 struct _EPROCESS
*Process
,
1312 MmMarkPageMapped(PFN_TYPE Page
);
1316 MmMarkPageUnmapped(PFN_TYPE Page
);
1321 struct _EPROCESS
*Process
,
1328 MiInitPageDirectoryMap(VOID
);
1332 MiGetUserPageDirectoryCount(VOID
);
1334 /* wset.c ********************************************************************/
1343 /* region.c ************************************************************/
1348 PMM_AVL_TABLE AddressSpace
,
1350 PLIST_ENTRY RegionListHead
,
1355 PMM_ALTER_REGION_FUNC AlterFunc
1361 PLIST_ENTRY RegionListHead
,
1371 PLIST_ENTRY RegionListHead
,
1373 PVOID
* RegionBaseAddress
1376 /* section.c *****************************************************************/
1380 MmGetFileObjectForSection(
1381 IN PROS_SECTION_OBJECT Section
1385 MmGetFileNameForAddress(
1387 OUT PUNICODE_STRING ModuleName
1392 MmGetFileNameForSection(
1393 IN PROS_SECTION_OBJECT Section
,
1394 OUT POBJECT_NAME_INFORMATION
*ModuleName
1407 PMEMORY_AREA MemoryArea
,
1409 PMEMORY_BASIC_INFORMATION Info
,
1415 MmProtectSectionView(
1416 PMM_AVL_TABLE AddressSpace
,
1417 PMEMORY_AREA MemoryArea
,
1426 MmWritePageSectionView(
1427 PMM_AVL_TABLE AddressSpace
,
1435 MmInitSectionImplementation(VOID
);
1439 MmNotPresentFaultSectionView(
1440 PMM_AVL_TABLE AddressSpace
,
1441 MEMORY_AREA
* MemoryArea
,
1448 MmPageOutSectionView(
1449 PMM_AVL_TABLE AddressSpace
,
1450 PMEMORY_AREA MemoryArea
,
1452 struct _MM_PAGEOP
*PageOp
1457 MmCreatePhysicalMemorySection(VOID
);
1461 MmAccessFaultSectionView(
1462 PMM_AVL_TABLE AddressSpace
,
1463 MEMORY_AREA
* MemoryArea
,
1470 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1472 /* mpw.c *********************************************************************/
1476 MmInitMpwThread(VOID
);
1480 MmInitBsmThread(VOID
);
1482 /* pager.c *******************************************************************/
1486 MiIsPagerThread(VOID
);
1490 MiStartPagerThread(VOID
);
1494 MiStopPagerThread(VOID
);
1498 MiQueryVirtualMemory(
1499 IN HANDLE ProcessHandle
,
1501 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1502 OUT PVOID VirtualMemoryInformation
,
1504 OUT PULONG ResultLength
1507 /* sysldr.c ******************************************************************/
1511 MiReloadBootLoadedDrivers(
1512 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1517 MiInitializeLoadedModuleList(
1518 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1524 IN PUNICODE_STRING FileName
,
1525 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1526 IN PUNICODE_STRING LoadedName OPTIONAL
,
1528 OUT PVOID
*ModuleObject
,
1529 OUT PVOID
*ImageBaseAddress
1534 MmUnloadSystemImage(
1535 IN PVOID ImageHandle
1541 IN HANDLE ImageHandle
,
1542 IN BOOLEAN PurgeSection
1547 MmCallDllInitialize(
1548 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1549 IN PLIST_ENTRY ListHead
1552 /* ReactOS Mm Hacks */
1555 MiSyncForProcessAttach(
1556 IN PKTHREAD NextThread
,
1557 IN PEPROCESS Process
1562 MiSyncForContextSwitch(
1566 extern PMM_AVL_TABLE MmKernelAddressSpace
;
1570 MmLockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1572 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1577 MmUnlockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1579 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1584 MmGetAddressSpaceOwner(IN PMM_AVL_TABLE AddressSpace
)
1586 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1587 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
);
1592 MmGetCurrentAddressSpace(VOID
)
1594 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->VadRoot
;
1599 MmGetKernelAddressSpace(VOID
)
1601 return MmKernelAddressSpace
;