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
;
19 extern LIST_ENTRY MmLoadedUserImageList
;
21 extern KMUTANT MmSystemLoadLock
;
23 extern ULONG MmNumberOfPagingFiles
;
25 extern PVOID MmUnloadedDrivers
;
26 extern PVOID MmLastUnloadedDrivers
;
27 extern PVOID MmTriageActionTaken
;
28 extern PVOID KernelVerifier
;
29 extern MM_DRIVER_VERIFIER_DATA MmVerifierData
;
31 extern SIZE_T MmTotalCommitLimit
;
32 extern SIZE_T MmTotalCommittedPages
;
33 extern SIZE_T MmSharedCommit
;
34 extern SIZE_T MmDriverCommit
;
35 extern SIZE_T MmProcessCommit
;
36 extern SIZE_T MmPagedPoolCommit
;
37 extern SIZE_T MmPeakCommitment
;
38 extern SIZE_T MmtotalCommitLimitMaximum
;
40 extern PVOID MiDebugMapping
; // internal
41 extern PMMPTE MmDebugPte
; // internal
45 struct _MM_RMAP_ENTRY
;
46 typedef ULONG_PTR SWAPENTRY
;
49 // MmDbgCopyMemory Flags
51 #define MMDBG_COPY_WRITE 0x00000001
52 #define MMDBG_COPY_PHYSICAL 0x00000002
53 #define MMDBG_COPY_UNSAFE 0x00000004
54 #define MMDBG_COPY_CACHED 0x00000008
55 #define MMDBG_COPY_UNCACHED 0x00000010
56 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
59 // Maximum chunk size per copy
61 #define MMDBG_COPY_MAX_SIZE 0x8
63 #if defined(_X86_) // intenal for marea.c
64 #define MI_STATIC_MEMORY_AREAS (14)
66 #define MI_STATIC_MEMORY_AREAS (13)
69 #define MEMORY_AREA_SECTION_VIEW (1)
70 #define MEMORY_AREA_CACHE (2)
71 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
72 #define MEMORY_AREA_STATIC (0x80000000)
74 /* Although Microsoft says this isn't hardcoded anymore,
75 they won't be able to change it. Stuff depends on it */
76 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
78 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
81 * Additional flags for protection attributes
83 #define PAGE_WRITETHROUGH (1024)
84 #define PAGE_SYSTEM (2048)
86 #define SEC_PHYSICALMEMORY (0x80000000)
88 #define MM_PAGEFILE_SEGMENT (0x1)
89 #define MM_DATAFILE_SEGMENT (0x2)
94 #define MC_MAXIMUM (3)
96 #define PAGED_POOL_MASK 1
97 #define MUST_SUCCEED_POOL_MASK 2
98 #define CACHE_ALIGNED_POOL_MASK 4
99 #define QUOTA_POOL_MASK 8
100 #define SESSION_POOL_MASK 32
101 #define VERIFIER_POOL_MASK 64
103 // FIXME: use ALIGN_UP_BY
104 #define MM_ROUND_UP(x,s) \
105 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
107 #define MM_ROUND_DOWN(x,s) \
108 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
110 #define PAGE_FLAGS_VALID_FOR_SECTION \
115 PAGE_EXECUTE_READ | \
116 PAGE_EXECUTE_READWRITE | \
117 PAGE_EXECUTE_WRITECOPY | \
120 #define PAGE_IS_READABLE \
124 PAGE_EXECUTE_READ | \
125 PAGE_EXECUTE_READWRITE | \
126 PAGE_EXECUTE_WRITECOPY)
128 #define PAGE_IS_WRITABLE \
131 PAGE_EXECUTE_READWRITE | \
132 PAGE_EXECUTE_WRITECOPY)
134 #define PAGE_IS_EXECUTABLE \
136 PAGE_EXECUTE_READ | \
137 PAGE_EXECUTE_READWRITE | \
138 PAGE_EXECUTE_WRITECOPY)
140 #define PAGE_IS_WRITECOPY \
142 PAGE_EXECUTE_WRITECOPY)
145 // Wait entry for marking pages that are being serviced
147 #define MM_WAIT_ENTRY 0x7ffffc00
149 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
150 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
152 #define InterlockedExchangePte(PointerPte, Value) \
153 InterlockedExchange((PLONG)(PointerPte), Value)
155 typedef struct _MM_SECTION_SEGMENT
157 FAST_MUTEX Lock
; /* lock which protects the page directory */
158 PFILE_OBJECT FileObject
;
159 LARGE_INTEGER RawLength
; /* length of the segment which is part of the mapped file */
160 LARGE_INTEGER Length
; /* absolute length of the segment */
161 ULONG ReferenceCount
;
170 ULONGLONG FileOffset
; /* start offset into the file for image sections */
171 ULONG_PTR VirtualAddress
; /* start offset into the address range for image sections */
172 ULONG Characteristics
;
175 LIST_ENTRY ListOfSegments
;
176 RTL_GENERIC_TABLE PageTable
;
177 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
179 typedef struct _MM_IMAGE_SECTION_OBJECT
181 SECTION_IMAGE_INFORMATION ImageInformation
;
184 PMM_SECTION_SEGMENT Segments
;
185 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
187 typedef struct _ROS_SECTION_OBJECT
191 LARGE_INTEGER MaximumSize
;
192 ULONG SectionPageProtection
;
193 ULONG AllocationAttributes
;
194 PFILE_OBJECT FileObject
;
197 PMM_IMAGE_SECTION_OBJECT ImageSection
;
198 PMM_SECTION_SEGMENT Segment
;
200 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
202 typedef struct _MEMORY_AREA
204 PVOID StartingAddress
;
206 struct _MEMORY_AREA
*Parent
;
207 struct _MEMORY_AREA
*LeftChild
;
208 struct _MEMORY_AREA
*RightChild
;
212 BOOLEAN DeleteInProgress
;
219 ROS_SECTION_OBJECT
* Section
;
220 LARGE_INTEGER ViewOffset
;
221 PMM_SECTION_SEGMENT Segment
;
222 LIST_ENTRY RegionListHead
;
226 LIST_ENTRY RegionListHead
;
229 } MEMORY_AREA
, *PMEMORY_AREA
;
231 typedef struct _MM_RMAP_ENTRY
233 struct _MM_RMAP_ENTRY
* Next
;
240 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
243 extern ULONG MI_PFN_CURRENT_USAGE
;
244 extern CHAR MI_PFN_CURRENT_PROCESS_NAME
[16];
245 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
246 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
248 #define MI_SET_USAGE(x)
249 #define MI_SET_PROCESS2(x)
252 typedef enum _MI_PFN_USAGES
254 MI_USAGE_NOT_SET
= 0,
256 MI_USAGE_NONPAGED_POOL
,
257 MI_USAGE_NONPAGED_POOL_EXPANSION
,
258 MI_USAGE_KERNEL_STACK
,
259 MI_USAGE_KERNEL_STACK_EXPANSION
,
265 MI_USAGE_PAGE_DIRECTORY
,
266 MI_USAGE_LEGACY_PAGE_DIRECTORY
,
267 MI_USAGE_DRIVER_PAGE
,
268 MI_USAGE_CONTINOUS_ALLOCATION
,
270 MI_USAGE_DEMAND_ZERO
,
273 MI_USAGE_PFN_DATABASE
,
274 MI_USAGE_BOOT_DRIVER
,
275 MI_USAGE_INIT_MEMORY
,
280 // These two mappings are actually used by Windows itself, based on the ASSERTS
282 #define StartOfAllocation ReadInProgress
283 #define EndOfAllocation WriteInProgress
285 typedef struct _MMPFNENTRY
288 USHORT ReadInProgress
:1; // StartOfAllocation
289 USHORT WriteInProgress
:1; // EndOfAllocation
290 USHORT PrototypePte
:1;
292 USHORT PageLocation
:3;
293 USHORT RemovalRequested
:1;
294 USHORT CacheAttribute
:2;
296 USHORT ParityError
:1;
300 typedef struct _MMPFN
308 SINGLE_LIST_ENTRY NextStackPfn
;
317 ULONG_PTR ShareCount
;
323 USHORT ReferenceCount
;
328 USHORT ReferenceCount
;
335 LONG AweReferenceCount
;
338 PMM_RMAP_ENTRY RmapListHead
;
342 ULONG_PTR EntireFrame
;
345 ULONG_PTR PteFrame
:25;
346 ULONG_PTR InPageError
:1;
347 ULONG_PTR VerifierAllocation
:1;
348 ULONG_PTR AweAllocation
:1;
349 ULONG_PTR Priority
:3;
350 ULONG_PTR MustBeCached
:1;
354 MI_PFN_USAGES PfnUsage
;
355 CHAR ProcessName
[16];
358 // HACK until WS lists are supported
362 extern PMMPFN MmPfnDatabase
;
364 typedef struct _MMPFNLIST
370 } MMPFNLIST
, *PMMPFNLIST
;
372 extern MMPFNLIST MmZeroedPageListHead
;
373 extern MMPFNLIST MmFreePageListHead
;
374 extern MMPFNLIST MmStandbyPageListHead
;
375 extern MMPFNLIST MmModifiedPageListHead
;
376 extern MMPFNLIST MmModifiedNoWritePageListHead
;
378 typedef struct _MM_MEMORY_CONSUMER
382 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
383 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
385 typedef struct _MM_REGION
390 LIST_ENTRY RegionListEntry
;
391 } MM_REGION
, *PMM_REGION
;
394 /* Entry describing free pool memory */
395 typedef struct _MMFREE_POOL_ENTRY
400 struct _MMFREE_POOL_ENTRY
*Owner
;
401 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
403 /* Signature of a freed block */
404 #define MM_FREE_POOL_SIGNATURE 'ARM3'
406 /* Paged pool information */
407 typedef struct _MM_PAGED_POOL_INFO
409 PRTL_BITMAP PagedPoolAllocationMap
;
410 PRTL_BITMAP EndOfPagedPoolBitmap
;
411 PMMPTE FirstPteForPagedPool
;
412 PMMPTE LastPteForPagedPool
;
413 PMMPDE NextPdeForPagedPoolExpansion
;
415 SIZE_T PagedPoolCommit
;
416 SIZE_T AllocatedPagedPool
;
417 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
419 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
422 (*PMM_ALTER_REGION_FUNC
)(
423 PMMSUPPORT AddressSpace
,
433 (*PMM_FREE_PAGE_FUNC
)(
435 PMEMORY_AREA MemoryArea
,
443 // Mm copy support for Kd
455 // Determines if a given address is a session address
475 /* marea.c *******************************************************************/
480 PMMSUPPORT AddressSpace
,
485 PMEMORY_AREA
*Result
,
486 BOOLEAN FixedAddress
,
487 ULONG AllocationFlags
,
488 ULONG AllocationGranularity
493 MmLocateMemoryAreaByAddress(
494 PMMSUPPORT AddressSpace
,
502 PMMSUPPORT AddressSpace
,
509 PMMSUPPORT AddressSpace
,
510 PMEMORY_AREA MemoryArea
,
511 PMM_FREE_PAGE_FUNC FreePage
,
512 PVOID FreePageContext
517 MmFreeMemoryAreaByPtr(
518 PMMSUPPORT AddressSpace
,
520 PMM_FREE_PAGE_FUNC FreePage
,
521 PVOID FreePageContext
526 MmLocateMemoryAreaByRegion(
527 PMMSUPPORT AddressSpace
,
535 PMMSUPPORT AddressSpace
,
537 ULONG_PTR Granularity
,
543 MiRosCheckMemoryAreas(
544 PMMSUPPORT AddressSpace
);
548 MiCheckAllProcessMemoryAreas(VOID
);
550 /* npool.c *******************************************************************/
554 MiInitializeNonPagedPool(VOID
);
559 IN POOL_TYPE PoolType
,
560 IN SIZE_T SizeInBytes
566 IN PVOID VirtualAddress
572 IN PVOID StartingAddress
575 /* pool.c *******************************************************************/
580 IN POOL_TYPE PoolType
,
581 IN ULONG CurrentMaxQuota
,
582 OUT PULONG NewMaxQuota
585 /* mdl.c *********************************************************************/
594 /* mminit.c ******************************************************************/
604 MmInitSystem(IN ULONG Phase
,
605 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
608 /* pagefile.c ****************************************************************/
612 MmAllocSwapPage(VOID
);
616 MmFreeSwapPage(SWAPENTRY Entry
);
620 MmInitPagingFile(VOID
);
624 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject
);
642 MmShowOutOfSpaceMessagePagingFile(VOID
);
647 _In_ PFN_NUMBER Page
,
648 _In_ ULONG PageFileIndex
,
649 _In_ ULONG_PTR PageFileOffset
);
651 /* process.c ****************************************************************/
655 MmInitializeProcessAddressSpace(
656 IN PEPROCESS Process
,
657 IN PEPROCESS Clone OPTIONAL
,
658 IN PVOID Section OPTIONAL
,
660 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
666 IN PEPROCESS Process
,
667 IN PINITIAL_PEB InitialPeb
,
674 IN PEPROCESS Process
,
675 IN PCLIENT_ID ClientId
,
676 IN PINITIAL_TEB InitialTeb
,
683 struct _EPROCESS
*Process
,
689 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
693 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
697 MmGetSessionLocaleId(VOID
);
701 MmSetMemoryPriorityProcess(
702 IN PEPROCESS Process
,
703 IN UCHAR MemoryPriority
706 /* i386/pfault.c *************************************************************/
718 /* special.c *****************************************************************/
722 MiInitializeSpecialPool();
727 IN SIZE_T NumberOfBytes
,
732 MmIsSpecialPoolAddress(
737 MmAllocateSpecialPool(
738 IN SIZE_T NumberOfBytes
,
740 IN POOL_TYPE PoolType
,
741 IN ULONG SpecialType
);
748 /* mm.c **********************************************************************/
753 IN BOOLEAN StoreInstruction
,
755 IN KPROCESSOR_MODE Mode
,
756 IN PVOID TrapInformation
759 /* kmap.c ********************************************************************/
768 /* process.c *****************************************************************/
772 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
776 MmDeleteKernelStack(PVOID Stack
,
779 /* balace.c ******************************************************************/
783 MmInitializeMemoryConsumer(
785 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
790 MmInitializeBalancer(
791 ULONG NrAvailablePages
,
797 MmReleasePageMemoryConsumer(
804 MmRequestPageMemoryConsumer(
807 PPFN_NUMBER AllocatedPage
812 MiInitBalancerThread(VOID
);
816 MmRebalanceMemoryConsumers(VOID
);
818 /* rmap.c **************************************************************/
822 MmSetRmapListHeadPage(
824 struct _MM_RMAP_ENTRY
* ListHead
827 struct _MM_RMAP_ENTRY
*
829 MmGetRmapListHeadPage(PFN_NUMBER Page
);
835 struct _EPROCESS
*Process
,
844 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
851 struct _EPROCESS
*Process
,
857 MmInitializeRmapList(VOID
);
861 MmSetCleanAllRmaps(PFN_NUMBER Page
);
865 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
869 MmIsDirtyPageRmap(PFN_NUMBER Page
);
873 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
875 /* freelist.c **********************************************************/
879 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
882 extern RTL_BITMAP MiPfnBitMap
;
884 /* Make sure the PFN number is valid */
885 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
887 /* Make sure this page actually has a PFN entry */
888 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, (ULONG
)Pfn
))) return NULL
;
891 Page
= &MmPfnDatabase
[Pfn
];
899 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
902 // This will return the Page Frame Number (PFN) from the MMPFN
904 return Pfn1
- MmPfnDatabase
;
909 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
913 MmGetLRUFirstUserPage(VOID
);
917 MmInsertLRULastUserPage(PFN_NUMBER Page
);
921 MmRemoveLRUUserPage(PFN_NUMBER Page
);
925 MmDumpArmPfnDatabase(
926 IN BOOLEAN StatusOnly
935 /* hypermap.c *****************************************************************/
937 extern PEPROCESS HyperProcess
;
938 extern KIRQL HyperIrql
;
942 MiMapPageInHyperSpace(IN PEPROCESS Process
,
948 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
954 MiMapPagesInZeroSpace(IN PMMPFN Pfn1
,
955 IN PFN_NUMBER NumberOfPages
);
959 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
960 IN PFN_NUMBER NumberOfPages
);
963 // ReactOS Compatibility Layer
967 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
969 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
970 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
973 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
975 /* i386/page.c *********************************************************/
979 MmCreateVirtualMapping(
980 struct _EPROCESS
* Process
,
989 MmCreateVirtualMappingUnsafe(
990 struct _EPROCESS
* Process
,
1000 struct _EPROCESS
* Process
,
1006 struct _EPROCESS
* Process
,
1014 struct _EPROCESS
* Process
,
1021 struct _EPROCESS
* Process
,
1027 MmInitGlobalKernelPageDirectory(VOID
);
1031 MmGetPageFileMapping(
1032 struct _EPROCESS
*Process
,
1034 SWAPENTRY
* SwapEntry
);
1038 MmDeletePageFileMapping(
1039 struct _EPROCESS
*Process
,
1041 SWAPENTRY
* SwapEntry
1046 MmCreatePageFileMapping(
1047 struct _EPROCESS
*Process
,
1055 struct _EPROCESS
*Process
,
1062 struct _EPROCESS
*Process
,
1074 MmDereferencePage(PFN_NUMBER Page
);
1078 MmReferencePage(PFN_NUMBER Page
);
1082 MmGetReferenceCountPage(PFN_NUMBER Page
);
1086 MmIsPageInUse(PFN_NUMBER Page
);
1090 MmSetSavedSwapEntryPage(
1092 SWAPENTRY SavedSwapEntry
);
1096 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1101 struct _EPROCESS
*Process
,
1108 struct _EPROCESS
*Process
,
1115 struct _EPROCESS
*Process
,
1121 MmCreateProcessAddressSpace(
1124 IN PULONG_PTR DirectoryTableBase
1129 MmInitializeHandBuiltProcess(
1130 IN PEPROCESS Process
,
1131 IN PULONG_PTR DirectoryTableBase
1137 MmInitializeHandBuiltProcess2(
1138 IN PEPROCESS Process
1143 MmSetExecuteOptions(IN ULONG ExecuteOptions
);
1147 MmGetExecuteOptions(IN PULONG ExecuteOptions
);
1151 MmDeleteVirtualMapping(
1152 struct _EPROCESS
*Process
,
1161 struct _EPROCESS
*Process
,
1165 /* wset.c ********************************************************************/
1174 /* region.c ************************************************************/
1179 PMMSUPPORT AddressSpace
,
1181 PLIST_ENTRY RegionListHead
,
1186 PMM_ALTER_REGION_FUNC AlterFunc
1192 PLIST_ENTRY RegionListHead
,
1202 PLIST_ENTRY RegionListHead
,
1204 PVOID
* RegionBaseAddress
1207 /* section.c *****************************************************************/
1211 MmGetImageInformation(
1212 OUT PSECTION_IMAGE_INFORMATION ImageInformation
1217 MmGetFileObjectForSection(
1222 MmGetFileNameForAddress(
1224 OUT PUNICODE_STRING ModuleName
1229 MmGetFileNameForSection(
1231 OUT POBJECT_NAME_INFORMATION
*ModuleName
1237 PMEMORY_AREA MemoryArea
,
1239 PMEMORY_BASIC_INFORMATION Info
,
1240 PSIZE_T ResultLength
1245 MmProtectSectionView(
1246 PMMSUPPORT AddressSpace
,
1247 PMEMORY_AREA MemoryArea
,
1256 MmInitSectionImplementation(VOID
);
1260 MmNotPresentFaultSectionView(
1261 PMMSUPPORT AddressSpace
,
1262 MEMORY_AREA
* MemoryArea
,
1269 MmPageOutSectionView(
1270 PMMSUPPORT AddressSpace
,
1271 PMEMORY_AREA MemoryArea
,
1278 MmCreatePhysicalMemorySection(VOID
);
1282 MmAccessFaultSectionView(
1283 PMMSUPPORT AddressSpace
,
1284 MEMORY_AREA
* MemoryArea
,
1290 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1292 /* sysldr.c ******************************************************************/
1296 MiReloadBootLoadedDrivers(
1297 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1302 MiInitializeLoadedModuleList(
1303 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1309 IN PUNICODE_STRING FileName
,
1310 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1311 IN PUNICODE_STRING LoadedName OPTIONAL
,
1313 OUT PVOID
*ModuleObject
,
1314 OUT PVOID
*ImageBaseAddress
1319 MmUnloadSystemImage(
1320 IN PVOID ImageHandle
1326 IN HANDLE ImageHandle
,
1327 IN BOOLEAN PurgeSection
1332 MmCallDllInitialize(
1333 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1334 IN PLIST_ENTRY ListHead
1338 /* procsup.c *****************************************************************/
1343 IN PVOID StackPointer
1349 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1351 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1356 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1358 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1363 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1365 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1366 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1371 MmGetCurrentAddressSpace(VOID
)
1373 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1378 MmGetKernelAddressSpace(VOID
)
1380 return MmKernelAddressSpace
;
1384 /* expool.c ******************************************************************/
1388 ExpCheckPoolAllocation(
1394 /* mmsup.c *****************************************************************/
1398 MmAdjustWorkingSetSize(
1399 IN SIZE_T WorkingSetMinimumInBytes
,
1400 IN SIZE_T WorkingSetMaximumInBytes
,
1401 IN ULONG SystemCache
,
1402 IN BOOLEAN IncreaseOkay
);
1405 /* session.c *****************************************************************/
1407 _IRQL_requires_max_(APC_LEVEL
)
1411 _Inout_ PVOID SessionEntry
,
1412 _Out_ PKAPC_STATE ApcState
);
1414 _IRQL_requires_max_(APC_LEVEL
)
1418 _Inout_ PVOID SessionEntry
,
1419 _Out_ PKAPC_STATE ApcState
);
1424 _Inout_ PVOID SessionEntry
);
1429 _In_ ULONG SessionId
);
1431 _IRQL_requires_max_(APC_LEVEL
)
1434 MmSetSessionLocaleId(
1435 _In_ LCID LocaleId
);
1438 /* virtual.c *****************************************************************/
1442 MmCopyVirtualMemory(IN PEPROCESS SourceProcess
,
1443 IN PVOID SourceAddress
,
1444 IN PEPROCESS TargetProcess
,
1445 OUT PVOID TargetAddress
,
1446 IN SIZE_T BufferSize
,
1447 IN KPROCESSOR_MODE PreviousMode
,
1448 OUT PSIZE_T ReturnSize
);