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_FLAGS_VALID_FOR_SECTION \
148 PAGE_EXECUTE_READ | \
149 PAGE_EXECUTE_READWRITE | \
150 PAGE_EXECUTE_WRITECOPY | \
153 #define PAGE_IS_READABLE \
157 PAGE_EXECUTE_READ | \
158 PAGE_EXECUTE_READWRITE | \
159 PAGE_EXECUTE_WRITECOPY)
161 #define PAGE_IS_WRITABLE \
164 PAGE_EXECUTE_READWRITE | \
165 PAGE_EXECUTE_WRITECOPY)
167 #define PAGE_IS_EXECUTABLE \
169 PAGE_EXECUTE_READ | \
170 PAGE_EXECUTE_READWRITE | \
171 PAGE_EXECUTE_WRITECOPY)
173 #define PAGE_IS_WRITECOPY \
175 PAGE_EXECUTE_WRITECOPY)
178 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
179 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
181 #define InterlockedExchangePte(PointerPte, Value) \
182 InterlockedExchange((PLONG)(PointerPte), Value)
186 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
187 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
191 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
192 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
194 typedef struct _MM_SECTION_SEGMENT
196 LONG FileOffset
; /* start offset into the file for image sections */
197 ULONG_PTR VirtualAddress
; /* dtart offset into the address range for image sections */
198 ULONG RawLength
; /* length of the segment which is part of the mapped file */
199 ULONG Length
; /* absolute length of the segment */
201 FAST_MUTEX Lock
; /* lock which protects the page directory */
202 ULONG ReferenceCount
;
203 SECTION_PAGE_DIRECTORY PageDirectory
;
205 ULONG Characteristics
;
207 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
209 typedef struct _MM_IMAGE_SECTION_OBJECT
212 ULONG_PTR StackReserve
;
213 ULONG_PTR StackCommit
;
214 ULONG_PTR EntryPoint
;
216 USHORT ImageCharacteristics
;
217 USHORT MinorSubsystemVersion
;
218 USHORT MajorSubsystemVersion
;
223 PMM_SECTION_SEGMENT Segments
;
224 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
226 typedef struct _ROS_SECTION_OBJECT
230 LARGE_INTEGER MaximumSize
;
231 ULONG SectionPageProtection
;
232 ULONG AllocationAttributes
;
233 PFILE_OBJECT FileObject
;
236 PMM_IMAGE_SECTION_OBJECT ImageSection
;
237 PMM_SECTION_SEGMENT Segment
;
239 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
241 typedef struct _MEMORY_AREA
243 PVOID StartingAddress
;
245 struct _MEMORY_AREA
*Parent
;
246 struct _MEMORY_AREA
*LeftChild
;
247 struct _MEMORY_AREA
*RightChild
;
251 BOOLEAN DeleteInProgress
;
257 ROS_SECTION_OBJECT
* Section
;
259 PMM_SECTION_SEGMENT Segment
;
260 BOOLEAN WriteCopyView
;
261 LIST_ENTRY RegionListHead
;
265 LIST_ENTRY RegionListHead
;
268 } MEMORY_AREA
, *PMEMORY_AREA
;
278 ULONG PagingRequestsInLastMinute
;
279 ULONG PagingRequestsInLastFiveMinutes
;
280 ULONG PagingRequestsInLastFifteenMinutes
;
283 typedef struct _PHYSICAL_PAGE
292 ULONG StartOfAllocation
: 1;
293 ULONG EndOfAllocation
: 1;
299 LIST_ENTRY ListEntry
;
300 ULONG ReferenceCount
;
301 SWAPENTRY SavedSwapEntry
;
304 struct _MM_RMAP_ENTRY
* RmapListHead
;
306 PHYSICAL_PAGE
, *PPHYSICAL_PAGE
;
308 extern MM_STATS MmStats
;
310 typedef struct _MM_PAGEOP
312 /* Type of operation. */
314 /* Number of threads interested in this operation. */
315 ULONG ReferenceCount
;
316 /* Event that will be set when the operation is completed. */
317 KEVENT CompletionEvent
;
318 /* Status of the operation once it is completed. */
320 /* TRUE if the operation was abandoned. */
322 /* The memory area to be affected by the operation. */
325 struct _MM_PAGEOP
* Next
;
326 struct _ETHREAD
* Thread
;
328 * These fields are used to identify the operation if it is against a
329 * virtual memory area.
334 * These fields are used to identify the operation if it is against a
337 PMM_SECTION_SEGMENT Segment
;
339 } MM_PAGEOP
, *PMM_PAGEOP
;
341 typedef struct _MM_MEMORY_CONSUMER
345 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
346 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
348 typedef struct _MM_REGION
353 LIST_ENTRY RegionListEntry
;
354 } MM_REGION
, *PMM_REGION
;
356 /* Entry describing free pool memory */
357 typedef struct _MMFREE_POOL_ENTRY
362 struct _MMFREE_POOL_ENTRY
*Owner
;
363 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
365 /* Paged pool information */
366 typedef struct _MM_PAGED_POOL_INFO
368 PRTL_BITMAP PagedPoolAllocationMap
;
369 PRTL_BITMAP EndOfPagedPoolBitmap
;
370 PMMPTE FirstPteForPagedPool
;
371 PMMPTE LastPteForPagedPool
;
372 PMMPTE NextPdeForPagedPoolExpansion
;
374 SIZE_T PagedPoolCommit
;
375 SIZE_T AllocatedPagedPool
;
376 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
378 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
381 (*PMM_ALTER_REGION_FUNC
)(
382 PMM_AVL_TABLE AddressSpace
,
392 (*PMM_FREE_PAGE_FUNC
)(
394 PMEMORY_AREA MemoryArea
,
401 /* marea.c *******************************************************************/
406 PMM_AVL_TABLE AddressSpace
,
411 PMEMORY_AREA
*Result
,
412 BOOLEAN FixedAddress
,
413 ULONG AllocationFlags
,
414 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
419 MmLocateMemoryAreaByAddress(
420 PMM_AVL_TABLE AddressSpace
,
427 PMM_AVL_TABLE AddressSpace
,
434 PMM_AVL_TABLE AddressSpace
,
435 PMEMORY_AREA MemoryArea
,
436 PMM_FREE_PAGE_FUNC FreePage
,
437 PVOID FreePageContext
442 MmFreeMemoryAreaByPtr(
443 PMM_AVL_TABLE AddressSpace
,
445 PMM_FREE_PAGE_FUNC FreePage
,
446 PVOID FreePageContext
451 MmDumpMemoryAreas(PMM_AVL_TABLE AddressSpace
);
455 MmLocateMemoryAreaByRegion(
456 PMM_AVL_TABLE AddressSpace
,
464 PMM_AVL_TABLE AddressSpace
,
466 ULONG_PTR Granularity
,
472 MmReleaseMemoryAreaIfDecommitted(
473 struct _EPROCESS
*Process
,
474 PMM_AVL_TABLE AddressSpace
,
480 MmMapMemoryArea(PVOID BaseAddress
,
485 /* npool.c *******************************************************************/
489 MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
493 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
497 MiInitializeNonPagedPool(VOID
);
502 IN POOL_TYPE PoolType
,
503 IN SIZE_T SizeInBytes
509 IN PVOID VirtualAddress
515 IN PVOID StartingAddress
525 /* pool.c *******************************************************************/
529 ExAllocateNonPagedPoolWithTag(
538 ExAllocatePagedPoolWithTag(
546 ExFreeNonPagedPool(PVOID block
);
550 ExFreePagedPool(IN PVOID Block
);
554 MmInitializePagedPool(VOID
);
558 MiAllocateSpecialPool(
559 IN POOL_TYPE PoolType
,
560 IN SIZE_T NumberOfBytes
,
568 IN POOL_TYPE PoolType
,
569 IN ULONG CurrentMaxQuota
,
570 OUT PULONG NewMaxQuota
573 /* mdl.c *********************************************************************/
582 /* mminit.c ******************************************************************/
586 MiShutdownMemoryManager(VOID
);
596 MmInitSystem(IN ULONG Phase
,
597 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
601 MiFreeInitMemory(VOID
);
605 MmInitializeMdlImplementation(VOID
);
607 /* pagefile.c ****************************************************************/
611 MmAllocSwapPage(VOID
);
615 MmDereserveSwapPages(ULONG Nr
);
619 MmFreeSwapPage(SWAPENTRY Entry
);
623 MmInitPagingFile(VOID
);
634 MmReserveSwapPages(ULONG Nr
);
647 ULONG BugCodeParameter1
,
648 ULONG BugCodeParameter2
,
649 ULONG BugCodeParameter3
,
650 ULONG BugCodeParameter4
,
651 struct _KTRAP_FRAME
* TrapFrame
656 MmIsAvailableSwapPage(VOID
);
660 MmShowOutOfSpaceMessagePagingFile(VOID
);
662 /* process.c ****************************************************************/
666 MmInitializeProcessAddressSpace(
667 IN PEPROCESS Process
,
668 IN PEPROCESS Clone OPTIONAL
,
669 IN PVOID Section OPTIONAL
,
671 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
676 MmCreatePeb(struct _EPROCESS
*Process
);
681 struct _EPROCESS
*Process
,
683 PINITIAL_TEB InitialTeb
689 struct _EPROCESS
*Process
,
695 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
699 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
703 MmGetSessionLocaleId(VOID
);
707 MmSetMemoryPriorityProcess(
708 IN PEPROCESS Process
,
709 IN UCHAR MemoryPriority
712 /* i386/pfault.c *************************************************************/
724 /* mm.c **********************************************************************/
729 IN BOOLEAN StoreInstruction
,
731 IN KPROCESSOR_MODE Mode
,
732 IN PVOID TrapInformation
735 /* anonmem.c *****************************************************************/
739 MmNotPresentFaultVirtualMemory(
740 PMM_AVL_TABLE AddressSpace
,
741 MEMORY_AREA
* MemoryArea
,
748 MmPageOutVirtualMemory(
749 PMM_AVL_TABLE AddressSpace
,
750 PMEMORY_AREA MemoryArea
,
752 struct _MM_PAGEOP
* PageOp
758 PMEMORY_AREA MemoryArea
,
760 PMEMORY_BASIC_INFORMATION Info
,
767 struct _EPROCESS
* Process
,
768 PMEMORY_AREA MemoryArea
774 PMM_AVL_TABLE AddressSpace
,
775 PMEMORY_AREA MemoryArea
,
784 MmWritePageVirtualMemory(
785 PMM_AVL_TABLE AddressSpace
,
791 /* kmap.c ********************************************************************/
795 ExAllocatePage(VOID
);
799 ExUnmapPage(PVOID Addr
);
803 ExAllocatePageWithPhysPage(PFN_TYPE Page
);
814 MiZeroPage(PFN_TYPE Page
);
816 /* memsafe.s *****************************************************************/
820 MmSafeReadPtr(PVOID Source
);
822 /* pageop.c ******************************************************************/
826 MmReleasePageOp(PMM_PAGEOP PageOp
);
834 PMM_SECTION_SEGMENT Segment
,
846 PMM_SECTION_SEGMENT Segment
,
852 MmInitializePageOp(VOID
);
854 /* process.c *****************************************************************/
858 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
862 MmDeleteKernelStack(PVOID Stack
,
865 /* balace.c ******************************************************************/
869 MmInitializeMemoryConsumer(
871 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
876 MmInitializeBalancer(
877 ULONG NrAvailablePages
,
883 MmReleasePageMemoryConsumer(
890 MmRequestPageMemoryConsumer(
893 PPFN_TYPE AllocatedPage
898 MiInitBalancerThread(VOID
);
902 MmRebalanceMemoryConsumers(VOID
);
904 /* rmap.c **************************************************************/
908 MmSetRmapListHeadPage(
910 struct _MM_RMAP_ENTRY
* ListHead
913 struct _MM_RMAP_ENTRY
*
915 MmGetRmapListHeadPage(PFN_TYPE Page
);
921 struct _EPROCESS
*Process
,
930 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
937 struct _EPROCESS
*Process
,
943 MmInitializeRmapList(VOID
);
947 MmSetCleanAllRmaps(PFN_TYPE Page
);
951 MmSetDirtyAllRmaps(PFN_TYPE Page
);
955 MmIsDirtyPageRmap(PFN_TYPE Page
);
959 MmWritePagePhysicalAddress(PFN_TYPE Page
);
963 MmPageOutPhysicalAddress(PFN_TYPE Page
);
965 /* freelist.c **********************************************************/
967 #define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
971 MiGetPfnEntry(IN PFN_TYPE Pfn
)
974 extern PPHYSICAL_PAGE MmPageArray
;
975 extern ULONG MmPageArraySize
;
977 /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
978 UNREFERENCED_PARAMETER(MmPageArraySize
);
980 /* Make sure the PFN number is valid */
981 ASSERT(Pfn
<= MmPageArraySize
);
984 Page
= &MmPageArray
[Pfn
];
986 /* Make sure it's valid */
995 MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
999 MmGetLRUFirstUserPage(VOID
);
1003 MmInsertLRULastUserPage(PFN_TYPE Page
);
1007 MmRemoveLRUUserPage(PFN_TYPE Page
);
1011 MmLockPage(PFN_TYPE Page
);
1015 MmLockPageUnsafe(PFN_TYPE Page
);
1019 MmUnlockPage(PFN_TYPE Page
);
1023 MmGetLockCountPage(PFN_TYPE Page
);
1029 MmAcquirePageListLock()
1031 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
1037 MmReleasePageListLock(KIRQL oldIrql
)
1039 KeReleaseQueuedSpinLock(LockQueuePfnLock
, oldIrql
);
1044 MmInitializePageList(
1050 MmGetContinuousPages(
1051 ULONG NumberOfBytes
,
1052 PHYSICAL_ADDRESS LowestAcceptableAddress
,
1053 PHYSICAL_ADDRESS HighestAcceptableAddress
,
1054 PHYSICAL_ADDRESS BoundaryAddressMultiple
1059 MmZeroPageThreadMain(
1063 /* i386/page.c *********************************************************/
1067 MmCreateHyperspaceMapping(PFN_TYPE Page
);
1071 MmDeleteHyperspaceMapping(PVOID Address
);
1075 MmCreateVirtualMappingForKernel(
1084 MmCommitPagedPoolAddress(
1091 MmCreateVirtualMapping(
1092 struct _EPROCESS
* Process
,
1101 MmCreateVirtualMappingUnsafe(
1102 struct _EPROCESS
* Process
,
1112 struct _EPROCESS
* Process
,
1118 struct _EPROCESS
* Process
,
1126 struct _EPROCESS
* Process
,
1132 MmInitGlobalKernelPageDirectory(VOID
);
1136 MmDisableVirtualMapping(
1137 struct _EPROCESS
*Process
,
1145 MmEnableVirtualMapping(
1146 struct _EPROCESS
*Process
,
1152 MmRawDeleteVirtualMapping(PVOID Address
);
1156 MmDeletePageFileMapping(
1157 struct _EPROCESS
*Process
,
1159 SWAPENTRY
* SwapEntry
1164 MmCreatePageFileMapping(
1165 struct _EPROCESS
*Process
,
1173 struct _EPROCESS
*Process
,
1179 MmTransferOwnershipPage(
1187 struct _EPROCESS
*Process
,
1195 SWAPENTRY SavedSwapEntry
1200 MmAllocPagesSpecifyRange(
1202 PHYSICAL_ADDRESS LowestAddress
,
1203 PHYSICAL_ADDRESS HighestAddress
,
1204 ULONG NumberOfPages
,
1210 MmDereferencePage(PFN_TYPE Page
);
1214 MmReferencePage(PFN_TYPE Page
);
1218 MmReferencePageUnsafe(PFN_TYPE Page
);
1222 MmGetReferenceCountPage(PFN_TYPE Page
);
1226 MmIsPageInUse(PFN_TYPE Page
);
1236 MmGetFlagsPage(PFN_TYPE Page
);
1240 MmSetSavedSwapEntryPage(
1242 SWAPENTRY SavedSwapEntry
);
1246 MmGetSavedSwapEntryPage(PFN_TYPE Page
);
1251 struct _EPROCESS
*Process
,
1257 MmCreatePageTable(PVOID PAddress
);
1262 struct _EPROCESS
*Process
,
1269 struct _EPROCESS
*Process
,
1275 MmCreateProcessAddressSpace(
1278 IN PULONG DirectoryTableBase
1283 MmInitializeHandBuiltProcess(
1284 IN PEPROCESS Process
,
1285 IN PULONG DirectoryTableBase
1291 MmInitializeHandBuiltProcess2(
1292 IN PEPROCESS Process
1297 MmReleaseMmInfo(struct _EPROCESS
*Process
);
1301 Mmi386ReleaseMmInfo(struct _EPROCESS
*Process
);
1305 MmDeleteVirtualMapping(
1306 struct _EPROCESS
*Process
,
1316 struct _EPROCESS
*Process
,
1322 MmMarkPageMapped(PFN_TYPE Page
);
1326 MmMarkPageUnmapped(PFN_TYPE Page
);
1331 struct _EPROCESS
*Process
,
1338 MiInitPageDirectoryMap(VOID
);
1342 MiGetUserPageDirectoryCount(VOID
);
1344 /* wset.c ********************************************************************/
1353 /* region.c ************************************************************/
1358 PMM_AVL_TABLE AddressSpace
,
1360 PLIST_ENTRY RegionListHead
,
1365 PMM_ALTER_REGION_FUNC AlterFunc
1371 PLIST_ENTRY RegionListHead
,
1381 PLIST_ENTRY RegionListHead
,
1383 PVOID
* RegionBaseAddress
1386 /* section.c *****************************************************************/
1390 MmGetFileObjectForSection(
1391 IN PROS_SECTION_OBJECT Section
1395 MmGetFileNameForAddress(
1397 OUT PUNICODE_STRING ModuleName
1402 MmGetFileNameForSection(
1403 IN PROS_SECTION_OBJECT Section
,
1404 OUT POBJECT_NAME_INFORMATION
*ModuleName
1417 PMEMORY_AREA MemoryArea
,
1419 PMEMORY_BASIC_INFORMATION Info
,
1425 MmProtectSectionView(
1426 PMM_AVL_TABLE AddressSpace
,
1427 PMEMORY_AREA MemoryArea
,
1436 MmWritePageSectionView(
1437 PMM_AVL_TABLE AddressSpace
,
1445 MmInitSectionImplementation(VOID
);
1449 MmNotPresentFaultSectionView(
1450 PMM_AVL_TABLE AddressSpace
,
1451 MEMORY_AREA
* MemoryArea
,
1458 MmPageOutSectionView(
1459 PMM_AVL_TABLE AddressSpace
,
1460 PMEMORY_AREA MemoryArea
,
1462 struct _MM_PAGEOP
*PageOp
1467 MmCreatePhysicalMemorySection(VOID
);
1471 MmAccessFaultSectionView(
1472 PMM_AVL_TABLE AddressSpace
,
1473 MEMORY_AREA
* MemoryArea
,
1480 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1482 /* mpw.c *********************************************************************/
1486 MmInitMpwThread(VOID
);
1490 MmInitBsmThread(VOID
);
1492 /* pager.c *******************************************************************/
1496 MiIsPagerThread(VOID
);
1500 MiStartPagerThread(VOID
);
1504 MiStopPagerThread(VOID
);
1508 MiQueryVirtualMemory(
1509 IN HANDLE ProcessHandle
,
1511 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass
,
1512 OUT PVOID VirtualMemoryInformation
,
1514 OUT PULONG ResultLength
1517 /* sysldr.c ******************************************************************/
1521 MiReloadBootLoadedDrivers(
1522 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1527 MiInitializeLoadedModuleList(
1528 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1534 IN PUNICODE_STRING FileName
,
1535 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1536 IN PUNICODE_STRING LoadedName OPTIONAL
,
1538 OUT PVOID
*ModuleObject
,
1539 OUT PVOID
*ImageBaseAddress
1544 MmUnloadSystemImage(
1545 IN PVOID ImageHandle
1551 IN HANDLE ImageHandle
,
1552 IN BOOLEAN PurgeSection
1557 MmCallDllInitialize(
1558 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1559 IN PLIST_ENTRY ListHead
1562 /* ReactOS Mm Hacks */
1565 MiSyncForProcessAttach(
1566 IN PKTHREAD NextThread
,
1567 IN PEPROCESS Process
1572 MiSyncForContextSwitch(
1576 extern PMM_AVL_TABLE MmKernelAddressSpace
;
1580 MmLockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1582 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1587 MmUnlockAddressSpace(PMM_AVL_TABLE AddressSpace
)
1589 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
)->AddressCreationLock
);
1594 MmGetAddressSpaceOwner(IN PMM_AVL_TABLE AddressSpace
)
1596 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1597 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, VadRoot
);
1602 MmGetCurrentAddressSpace(VOID
)
1604 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->VadRoot
;
1609 MmGetKernelAddressSpace(VOID
)
1611 return MmKernelAddressSpace
;