3 #include <internal/arch/mm.h>
5 /* TYPES *********************************************************************/
9 extern PMMSUPPORT MmKernelAddressSpace
;
10 extern PFN_COUNT MiFreeSwapPages
;
11 extern PFN_COUNT MiUsedSwapPages
;
12 extern PFN_COUNT MmNumberOfPhysicalPages
;
13 extern UCHAR MmDisablePagingExecutive
;
14 extern PFN_NUMBER MmLowestPhysicalPage
;
15 extern PFN_NUMBER MmHighestPhysicalPage
;
16 extern PFN_NUMBER MmAvailablePages
;
17 extern PFN_NUMBER MmResidentAvailablePages
;
18 extern ULONG MmThrottleTop
;
19 extern ULONG MmThrottleBottom
;
21 extern LIST_ENTRY MmLoadedUserImageList
;
23 extern KMUTANT MmSystemLoadLock
;
25 extern ULONG MmNumberOfPagingFiles
;
27 extern PVOID MmUnloadedDrivers
;
28 extern PVOID MmLastUnloadedDrivers
;
29 extern PVOID MmTriageActionTaken
;
30 extern PVOID KernelVerifier
;
31 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
33 extern SIZE_T MmTotalCommitLimit
;
34 extern SIZE_T MmTotalCommittedPages
;
35 extern SIZE_T MmSharedCommit
;
36 extern SIZE_T MmDriverCommit
;
37 extern SIZE_T MmProcessCommit
;
38 extern SIZE_T MmPagedPoolCommit
;
39 extern SIZE_T MmPeakCommitment
;
40 extern SIZE_T MmtotalCommitLimitMaximum
;
42 extern PVOID MiDebugMapping
; // internal
43 extern PMMPTE MmDebugPte
; // internal
47 struct _MM_RMAP_ENTRY
;
48 typedef ULONG_PTR SWAPENTRY
;
51 // MmDbgCopyMemory Flags
53 #define MMDBG_COPY_WRITE 0x00000001
54 #define MMDBG_COPY_PHYSICAL 0x00000002
55 #define MMDBG_COPY_UNSAFE 0x00000004
56 #define MMDBG_COPY_CACHED 0x00000008
57 #define MMDBG_COPY_UNCACHED 0x00000010
58 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
61 // Maximum chunk size per copy
63 #define MMDBG_COPY_MAX_SIZE 0x8
65 #if defined(_X86_) // intenal for marea.c
66 #define MI_STATIC_MEMORY_AREAS (14)
68 #define MI_STATIC_MEMORY_AREAS (13)
71 #define MEMORY_AREA_SECTION_VIEW (1)
72 #define MEMORY_AREA_CACHE (2)
73 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
74 #define MEMORY_AREA_STATIC (0x80000000)
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)
96 #define MC_MAXIMUM (3)
98 #define PAGED_POOL_MASK 1
99 #define MUST_SUCCEED_POOL_MASK 2
100 #define CACHE_ALIGNED_POOL_MASK 4
101 #define QUOTA_POOL_MASK 8
102 #define SESSION_POOL_MASK 32
103 #define VERIFIER_POOL_MASK 64
105 #define MAX_PAGING_FILES (16)
107 // FIXME: use ALIGN_UP_BY
108 #define MM_ROUND_UP(x,s) \
109 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
111 #define MM_ROUND_DOWN(x,s) \
112 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
114 #define PAGE_FLAGS_VALID_FOR_SECTION \
119 PAGE_EXECUTE_READ | \
120 PAGE_EXECUTE_READWRITE | \
121 PAGE_EXECUTE_WRITECOPY | \
125 #define PAGE_IS_READABLE \
129 PAGE_EXECUTE_READ | \
130 PAGE_EXECUTE_READWRITE | \
131 PAGE_EXECUTE_WRITECOPY)
133 #define PAGE_IS_WRITABLE \
136 PAGE_EXECUTE_READWRITE | \
137 PAGE_EXECUTE_WRITECOPY)
139 #define PAGE_IS_EXECUTABLE \
141 PAGE_EXECUTE_READ | \
142 PAGE_EXECUTE_READWRITE | \
143 PAGE_EXECUTE_WRITECOPY)
145 #define PAGE_IS_WRITECOPY \
147 PAGE_EXECUTE_WRITECOPY)
150 // Wait entry for marking pages that are being serviced
152 #define MM_WAIT_ENTRY 0x7ffffc00
154 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
155 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
157 #define InterlockedExchangePte(PointerPte, Value) \
158 InterlockedExchange((PLONG)(PointerPte), Value)
160 typedef struct _MM_SECTION_SEGMENT
162 FAST_MUTEX Lock
; /* lock which protects the page directory */
163 PFILE_OBJECT FileObject
;
164 LARGE_INTEGER RawLength
; /* length of the segment which is part of the mapped file */
165 LARGE_INTEGER Length
; /* absolute length of the segment */
166 ULONG ReferenceCount
;
175 ULONGLONG FileOffset
; /* start offset into the file for image sections */
176 ULONG_PTR VirtualAddress
; /* start offset into the address range for image sections */
177 ULONG Characteristics
;
180 LIST_ENTRY ListOfSegments
;
181 RTL_GENERIC_TABLE PageTable
;
182 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
184 typedef struct _MM_IMAGE_SECTION_OBJECT
186 SECTION_IMAGE_INFORMATION ImageInformation
;
189 PMM_SECTION_SEGMENT Segments
;
190 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
192 typedef struct _ROS_SECTION_OBJECT
196 LARGE_INTEGER MaximumSize
;
197 ULONG SectionPageProtection
;
198 ULONG AllocationAttributes
;
199 PFILE_OBJECT FileObject
;
202 PMM_IMAGE_SECTION_OBJECT ImageSection
;
203 PMM_SECTION_SEGMENT Segment
;
205 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
207 #define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->VadNode.StartingVpn << PAGE_SHIFT)
208 #define MA_GetEndingAddress(_MemoryArea) (((_MemoryArea)->VadNode.EndingVpn + 1) << PAGE_SHIFT)
210 typedef struct _MEMORY_AREA
217 BOOLEAN DeleteInProgress
;
224 ROS_SECTION_OBJECT
* Section
;
225 LARGE_INTEGER ViewOffset
;
226 PMM_SECTION_SEGMENT Segment
;
227 LIST_ENTRY RegionListHead
;
231 LIST_ENTRY RegionListHead
;
234 } MEMORY_AREA
, *PMEMORY_AREA
;
236 typedef struct _MM_RMAP_ENTRY
238 struct _MM_RMAP_ENTRY
* Next
;
245 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
248 extern ULONG MI_PFN_CURRENT_USAGE
;
249 extern CHAR MI_PFN_CURRENT_PROCESS_NAME
[16];
250 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
251 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
253 #define MI_SET_USAGE(x)
254 #define MI_SET_PROCESS2(x)
257 typedef enum _MI_PFN_USAGES
259 MI_USAGE_NOT_SET
= 0,
261 MI_USAGE_NONPAGED_POOL
,
262 MI_USAGE_NONPAGED_POOL_EXPANSION
,
263 MI_USAGE_KERNEL_STACK
,
264 MI_USAGE_KERNEL_STACK_EXPANSION
,
270 MI_USAGE_PAGE_DIRECTORY
,
271 MI_USAGE_LEGACY_PAGE_DIRECTORY
,
272 MI_USAGE_DRIVER_PAGE
,
273 MI_USAGE_CONTINOUS_ALLOCATION
,
275 MI_USAGE_DEMAND_ZERO
,
278 MI_USAGE_PFN_DATABASE
,
279 MI_USAGE_BOOT_DRIVER
,
280 MI_USAGE_INIT_MEMORY
,
285 // These two mappings are actually used by Windows itself, based on the ASSERTS
287 #define StartOfAllocation ReadInProgress
288 #define EndOfAllocation WriteInProgress
290 typedef struct _MMPFNENTRY
293 USHORT ReadInProgress
:1; // StartOfAllocation
294 USHORT WriteInProgress
:1; // EndOfAllocation
295 USHORT PrototypePte
:1;
297 USHORT PageLocation
:3;
298 USHORT RemovalRequested
:1;
299 USHORT CacheAttribute
:2;
301 USHORT ParityError
:1;
305 typedef struct _MMPFN
313 SINGLE_LIST_ENTRY NextStackPfn
;
322 ULONG_PTR ShareCount
;
328 USHORT ReferenceCount
;
333 USHORT ReferenceCount
;
340 LONG AweReferenceCount
;
343 PMM_RMAP_ENTRY RmapListHead
;
347 ULONG_PTR EntireFrame
;
350 ULONG_PTR PteFrame
:25;
351 ULONG_PTR InPageError
:1;
352 ULONG_PTR VerifierAllocation
:1;
353 ULONG_PTR AweAllocation
:1;
354 ULONG_PTR Priority
:3;
355 ULONG_PTR MustBeCached
:1;
359 MI_PFN_USAGES PfnUsage
;
360 CHAR ProcessName
[16];
363 // HACK until WS lists are supported
367 extern PMMPFN MmPfnDatabase
;
369 typedef struct _MMPFNLIST
375 } MMPFNLIST
, *PMMPFNLIST
;
377 extern MMPFNLIST MmZeroedPageListHead
;
378 extern MMPFNLIST MmFreePageListHead
;
379 extern MMPFNLIST MmStandbyPageListHead
;
380 extern MMPFNLIST MmModifiedPageListHead
;
381 extern MMPFNLIST MmModifiedNoWritePageListHead
;
383 typedef struct _MM_MEMORY_CONSUMER
387 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
388 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
390 typedef struct _MM_REGION
395 LIST_ENTRY RegionListEntry
;
396 } MM_REGION
, *PMM_REGION
;
399 /* Entry describing free pool memory */
400 typedef struct _MMFREE_POOL_ENTRY
405 struct _MMFREE_POOL_ENTRY
*Owner
;
406 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
408 /* Signature of a freed block */
409 #define MM_FREE_POOL_SIGNATURE 'ARM3'
411 /* Paged pool information */
412 typedef struct _MM_PAGED_POOL_INFO
414 PRTL_BITMAP PagedPoolAllocationMap
;
415 PRTL_BITMAP EndOfPagedPoolBitmap
;
416 PMMPTE FirstPteForPagedPool
;
417 PMMPTE LastPteForPagedPool
;
418 PMMPDE NextPdeForPagedPoolExpansion
;
420 SIZE_T PagedPoolCommit
;
421 SIZE_T AllocatedPagedPool
;
422 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
424 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
426 /* Page file information */
427 typedef struct _MMPAGING_FILE
429 PFILE_OBJECT FileObject
;
431 LARGE_INTEGER MaximumSize
;
432 LARGE_INTEGER CurrentSize
;
433 PFN_NUMBER FreePages
;
434 PFN_NUMBER UsedPages
;
435 PRTL_BITMAP AllocMap
;
436 KSPIN_LOCK AllocMapLock
;
438 MMPAGING_FILE
, *PMMPAGING_FILE
;
440 extern PMMPAGING_FILE MmPagingFile
[MAX_PAGING_FILES
];
443 (*PMM_ALTER_REGION_FUNC
)(
444 PMMSUPPORT AddressSpace
,
454 (*PMM_FREE_PAGE_FUNC
)(
456 PMEMORY_AREA MemoryArea
,
464 // Mm copy support for Kd
476 // Determines if a given address is a session address
496 /* marea.c *******************************************************************/
501 PMMSUPPORT AddressSpace
,
506 PMEMORY_AREA
*Result
,
507 ULONG AllocationFlags
,
508 ULONG AllocationGranularity
513 MmLocateMemoryAreaByAddress(
514 PMMSUPPORT AddressSpace
,
521 PMMSUPPORT AddressSpace
,
522 PMEMORY_AREA MemoryArea
,
523 PMM_FREE_PAGE_FUNC FreePage
,
524 PVOID FreePageContext
529 MiRosCleanupMemoryArea(
535 MmLocateMemoryAreaByRegion(
536 PMMSUPPORT AddressSpace
,
544 PMMSUPPORT AddressSpace
,
546 ULONG_PTR Granularity
,
552 MiRosCheckMemoryAreas(
553 PMMSUPPORT AddressSpace
);
557 MiCheckAllProcessMemoryAreas(VOID
);
559 /* npool.c *******************************************************************/
563 MiInitializeNonPagedPool(VOID
);
568 IN POOL_TYPE PoolType
,
569 IN SIZE_T SizeInBytes
575 IN PVOID VirtualAddress
581 IN PVOID StartingAddress
584 /* pool.c *******************************************************************/
589 IN POOL_TYPE PoolType
,
590 IN ULONG CurrentMaxQuota
,
591 OUT PULONG NewMaxQuota
594 /* mdl.c *********************************************************************/
603 /* mminit.c ******************************************************************/
613 MmInitSystem(IN ULONG Phase
,
614 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
617 /* pagefile.c ****************************************************************/
621 MmAllocSwapPage(VOID
);
625 MmFreeSwapPage(SWAPENTRY Entry
);
629 MmInitPagingFile(VOID
);
633 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject
);
651 MmShowOutOfSpaceMessagePagingFile(VOID
);
656 _In_ PFN_NUMBER Page
,
657 _In_ ULONG PageFileIndex
,
658 _In_ ULONG_PTR PageFileOffset
);
660 /* process.c ****************************************************************/
664 MmInitializeProcessAddressSpace(
665 IN PEPROCESS Process
,
666 IN PEPROCESS Clone OPTIONAL
,
667 IN PVOID Section OPTIONAL
,
669 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
675 IN PEPROCESS Process
,
676 IN PINITIAL_PEB InitialPeb
,
683 IN PEPROCESS Process
,
684 IN PCLIENT_ID ClientId
,
685 IN PINITIAL_TEB InitialTeb
,
692 struct _EPROCESS
*Process
,
698 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
702 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
706 MmGetSessionLocaleId(VOID
);
710 MmSetMemoryPriorityProcess(
711 IN PEPROCESS Process
,
712 IN UCHAR MemoryPriority
715 /* i386/pfault.c *************************************************************/
727 /* special.c *****************************************************************/
731 MiInitializeSpecialPool(VOID
);
736 IN SIZE_T NumberOfBytes
,
741 MmIsSpecialPoolAddress(
746 MmIsSpecialPoolAddressFree(
751 MmAllocateSpecialPool(
752 IN SIZE_T NumberOfBytes
,
754 IN POOL_TYPE PoolType
,
755 IN ULONG SpecialType
);
762 /* mm.c **********************************************************************/
769 IN KPROCESSOR_MODE Mode
,
770 IN PVOID TrapInformation
773 /* kmap.c ********************************************************************/
779 const VOID
*SrcAddress
782 /* process.c *****************************************************************/
786 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
790 MmDeleteKernelStack(PVOID Stack
,
793 /* balace.c ******************************************************************/
797 MmInitializeMemoryConsumer(
799 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
804 MmInitializeBalancer(
805 ULONG NrAvailablePages
,
811 MmReleasePageMemoryConsumer(
818 MmRequestPageMemoryConsumer(
821 PPFN_NUMBER AllocatedPage
826 MiInitBalancerThread(VOID
);
830 MmRebalanceMemoryConsumers(VOID
);
832 /* rmap.c **************************************************************/
836 MmSetRmapListHeadPage(
838 struct _MM_RMAP_ENTRY
* ListHead
841 struct _MM_RMAP_ENTRY
*
843 MmGetRmapListHeadPage(PFN_NUMBER Page
);
849 struct _EPROCESS
*Process
,
858 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
865 struct _EPROCESS
*Process
,
871 MmInitializeRmapList(VOID
);
875 MmSetCleanAllRmaps(PFN_NUMBER Page
);
879 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
883 MmIsDirtyPageRmap(PFN_NUMBER Page
);
887 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
889 /* freelist.c **********************************************************/
893 MiAcquirePfnLock(VOID
)
895 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
903 KeReleaseQueuedSpinLock(LockQueuePfnLock
, OldIrql
);
908 MiAcquirePfnLockAtDpcLevel(VOID
)
910 PKSPIN_LOCK_QUEUE LockQueue
;
912 ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL
);
913 LockQueue
= &KeGetCurrentPrcb()->LockQueue
[LockQueuePfnLock
];
914 KeAcquireQueuedSpinLockAtDpcLevel(LockQueue
);
919 MiReleasePfnLockFromDpcLevel(VOID
)
921 PKSPIN_LOCK_QUEUE LockQueue
;
923 LockQueue
= &KeGetCurrentPrcb()->LockQueue
[LockQueuePfnLock
];
924 KeReleaseQueuedSpinLockFromDpcLevel(LockQueue
);
925 ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL
);
928 #define MI_ASSERT_PFN_LOCK_HELD() ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
932 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
935 extern RTL_BITMAP MiPfnBitMap
;
937 /* Make sure the PFN number is valid */
938 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
940 /* Make sure this page actually has a PFN entry */
941 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, (ULONG
)Pfn
))) return NULL
;
944 Page
= &MmPfnDatabase
[Pfn
];
952 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
955 // This will return the Page Frame Number (PFN) from the MMPFN
957 return Pfn1
- MmPfnDatabase
;
962 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
966 MmGetLRUFirstUserPage(VOID
);
970 MmInsertLRULastUserPage(PFN_NUMBER Page
);
974 MmRemoveLRUUserPage(PFN_NUMBER Page
);
978 MmDumpArmPfnDatabase(
979 IN BOOLEAN StatusOnly
988 /* hypermap.c *****************************************************************/
990 extern PEPROCESS HyperProcess
;
991 extern KIRQL HyperIrql
;
995 MiMapPageInHyperSpace(IN PEPROCESS Process
,
1001 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
1007 MiMapPagesInZeroSpace(IN PMMPFN Pfn1
,
1008 IN PFN_NUMBER NumberOfPages
);
1012 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
1013 IN PFN_NUMBER NumberOfPages
);
1016 // ReactOS Compatibility Layer
1020 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
1022 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
1023 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
1026 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
1028 /* i386/page.c *********************************************************/
1032 MmCreateVirtualMapping(
1033 struct _EPROCESS
* Process
,
1042 MmCreateVirtualMappingUnsafe(
1043 struct _EPROCESS
* Process
,
1053 struct _EPROCESS
* Process
,
1059 struct _EPROCESS
* Process
,
1067 struct _EPROCESS
* Process
,
1074 struct _EPROCESS
* Process
,
1080 MmInitGlobalKernelPageDirectory(VOID
);
1084 MmGetPageFileMapping(
1085 struct _EPROCESS
*Process
,
1087 SWAPENTRY
* SwapEntry
);
1091 MmDeletePageFileMapping(
1092 struct _EPROCESS
*Process
,
1094 SWAPENTRY
* SwapEntry
1099 MmCreatePageFileMapping(
1100 struct _EPROCESS
*Process
,
1108 struct _EPROCESS
*Process
,
1115 struct _EPROCESS
*Process
,
1127 MmDereferencePage(PFN_NUMBER Page
);
1131 MmReferencePage(PFN_NUMBER Page
);
1135 MmGetReferenceCountPage(PFN_NUMBER Page
);
1139 MmIsPageInUse(PFN_NUMBER Page
);
1143 MmSetSavedSwapEntryPage(
1145 SWAPENTRY SavedSwapEntry
);
1149 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1154 struct _EPROCESS
*Process
,
1161 struct _EPROCESS
*Process
,
1168 struct _EPROCESS
*Process
,
1174 MmCreateProcessAddressSpace(
1177 IN PULONG_PTR DirectoryTableBase
1182 MmInitializeHandBuiltProcess(
1183 IN PEPROCESS Process
,
1184 IN PULONG_PTR DirectoryTableBase
1190 MmInitializeHandBuiltProcess2(
1191 IN PEPROCESS Process
1196 MmSetExecuteOptions(IN ULONG ExecuteOptions
);
1200 MmGetExecuteOptions(IN PULONG ExecuteOptions
);
1204 MmDeleteVirtualMapping(
1205 struct _EPROCESS
*Process
,
1214 struct _EPROCESS
*Process
,
1218 /* wset.c ********************************************************************/
1227 /* region.c ************************************************************/
1232 PMMSUPPORT AddressSpace
,
1234 PLIST_ENTRY RegionListHead
,
1239 PMM_ALTER_REGION_FUNC AlterFunc
1245 PLIST_ENTRY RegionListHead
,
1255 PLIST_ENTRY RegionListHead
,
1257 PVOID
* RegionBaseAddress
1260 /* section.c *****************************************************************/
1264 MmGetImageInformation(
1265 OUT PSECTION_IMAGE_INFORMATION ImageInformation
1270 MmGetFileObjectForSection(
1275 MmGetFileNameForAddress(
1277 OUT PUNICODE_STRING ModuleName
1282 MmGetFileNameForSection(
1284 OUT POBJECT_NAME_INFORMATION
*ModuleName
1290 PMEMORY_AREA MemoryArea
,
1292 PMEMORY_BASIC_INFORMATION Info
,
1293 PSIZE_T ResultLength
1298 MmProtectSectionView(
1299 PMMSUPPORT AddressSpace
,
1300 PMEMORY_AREA MemoryArea
,
1309 MmInitSectionImplementation(VOID
);
1313 MmNotPresentFaultSectionView(
1314 PMMSUPPORT AddressSpace
,
1315 MEMORY_AREA
* MemoryArea
,
1322 MmPageOutSectionView(
1323 PMMSUPPORT AddressSpace
,
1324 PMEMORY_AREA MemoryArea
,
1331 MmCreatePhysicalMemorySection(VOID
);
1335 MmAccessFaultSectionView(
1336 PMMSUPPORT AddressSpace
,
1337 MEMORY_AREA
* MemoryArea
,
1343 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1345 /* sysldr.c ******************************************************************/
1349 MiReloadBootLoadedDrivers(
1350 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1355 MiInitializeLoadedModuleList(
1356 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1362 IN PUNICODE_STRING FileName
,
1363 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1364 IN PUNICODE_STRING LoadedName OPTIONAL
,
1366 OUT PVOID
*ModuleObject
,
1367 OUT PVOID
*ImageBaseAddress
1372 MmUnloadSystemImage(
1373 IN PVOID ImageHandle
1379 IN HANDLE ImageHandle
,
1380 IN BOOLEAN PurgeSection
1385 MmCallDllInitialize(
1386 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1387 IN PLIST_ENTRY ListHead
1391 /* procsup.c *****************************************************************/
1396 IN PVOID StackPointer
1402 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1404 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1409 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1411 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1416 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1418 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1419 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1424 MmGetCurrentAddressSpace(VOID
)
1426 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1431 MmGetKernelAddressSpace(VOID
)
1433 return MmKernelAddressSpace
;
1437 /* expool.c ******************************************************************/
1441 ExpCheckPoolAllocation(
1452 /* mmsup.c *****************************************************************/
1456 MmAdjustWorkingSetSize(
1457 IN SIZE_T WorkingSetMinimumInBytes
,
1458 IN SIZE_T WorkingSetMaximumInBytes
,
1459 IN ULONG SystemCache
,
1460 IN BOOLEAN IncreaseOkay
);
1463 /* session.c *****************************************************************/
1465 _IRQL_requires_max_(APC_LEVEL
)
1469 _Inout_ PVOID SessionEntry
,
1470 _Out_ PKAPC_STATE ApcState
);
1472 _IRQL_requires_max_(APC_LEVEL
)
1476 _Inout_ PVOID SessionEntry
,
1477 _Out_ PKAPC_STATE ApcState
);
1482 _Inout_ PVOID SessionEntry
);
1487 _In_ ULONG SessionId
);
1489 _IRQL_requires_max_(APC_LEVEL
)
1492 MmSetSessionLocaleId(
1493 _In_ LCID LocaleId
);
1495 /* shutdown.c *****************************************************************/
1498 MmShutdownSystem(IN ULONG Phase
);
1500 /* virtual.c *****************************************************************/
1504 MmCopyVirtualMemory(IN PEPROCESS SourceProcess
,
1505 IN PVOID SourceAddress
,
1506 IN PEPROCESS TargetProcess
,
1507 OUT PVOID TargetAddress
,
1508 IN SIZE_T BufferSize
,
1509 IN KPROCESSOR_MODE PreviousMode
,
1510 OUT PSIZE_T ReturnSize
);