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 | \
121 #define PAGE_IS_READABLE \
125 PAGE_EXECUTE_READ | \
126 PAGE_EXECUTE_READWRITE | \
127 PAGE_EXECUTE_WRITECOPY)
129 #define PAGE_IS_WRITABLE \
132 PAGE_EXECUTE_READWRITE | \
133 PAGE_EXECUTE_WRITECOPY)
135 #define PAGE_IS_EXECUTABLE \
137 PAGE_EXECUTE_READ | \
138 PAGE_EXECUTE_READWRITE | \
139 PAGE_EXECUTE_WRITECOPY)
141 #define PAGE_IS_WRITECOPY \
143 PAGE_EXECUTE_WRITECOPY)
146 // Wait entry for marking pages that are being serviced
148 #define MM_WAIT_ENTRY 0x7ffffc00
150 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
151 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
153 #define InterlockedExchangePte(PointerPte, Value) \
154 InterlockedExchange((PLONG)(PointerPte), Value)
156 typedef struct _MM_SECTION_SEGMENT
158 FAST_MUTEX Lock
; /* lock which protects the page directory */
159 PFILE_OBJECT FileObject
;
160 LARGE_INTEGER RawLength
; /* length of the segment which is part of the mapped file */
161 LARGE_INTEGER Length
; /* absolute length of the segment */
162 ULONG ReferenceCount
;
171 ULONGLONG FileOffset
; /* start offset into the file for image sections */
172 ULONG_PTR VirtualAddress
; /* start offset into the address range for image sections */
173 ULONG Characteristics
;
176 LIST_ENTRY ListOfSegments
;
177 RTL_GENERIC_TABLE PageTable
;
178 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
180 typedef struct _MM_IMAGE_SECTION_OBJECT
182 SECTION_IMAGE_INFORMATION ImageInformation
;
185 PMM_SECTION_SEGMENT Segments
;
186 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
188 typedef struct _ROS_SECTION_OBJECT
192 LARGE_INTEGER MaximumSize
;
193 ULONG SectionPageProtection
;
194 ULONG AllocationAttributes
;
195 PFILE_OBJECT FileObject
;
198 PMM_IMAGE_SECTION_OBJECT ImageSection
;
199 PMM_SECTION_SEGMENT Segment
;
201 } ROS_SECTION_OBJECT
, *PROS_SECTION_OBJECT
;
203 #define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->VadNode.StartingVpn << PAGE_SHIFT)
204 #define MA_GetEndingAddress(_MemoryArea) (((_MemoryArea)->VadNode.EndingVpn + 1) << PAGE_SHIFT)
206 typedef struct _MEMORY_AREA
213 BOOLEAN DeleteInProgress
;
220 ROS_SECTION_OBJECT
* Section
;
221 LARGE_INTEGER ViewOffset
;
222 PMM_SECTION_SEGMENT Segment
;
223 LIST_ENTRY RegionListHead
;
227 LIST_ENTRY RegionListHead
;
230 } MEMORY_AREA
, *PMEMORY_AREA
;
232 typedef struct _MM_RMAP_ENTRY
234 struct _MM_RMAP_ENTRY
* Next
;
241 MM_RMAP_ENTRY
, *PMM_RMAP_ENTRY
;
244 extern ULONG MI_PFN_CURRENT_USAGE
;
245 extern CHAR MI_PFN_CURRENT_PROCESS_NAME
[16];
246 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
247 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
249 #define MI_SET_USAGE(x)
250 #define MI_SET_PROCESS2(x)
253 typedef enum _MI_PFN_USAGES
255 MI_USAGE_NOT_SET
= 0,
257 MI_USAGE_NONPAGED_POOL
,
258 MI_USAGE_NONPAGED_POOL_EXPANSION
,
259 MI_USAGE_KERNEL_STACK
,
260 MI_USAGE_KERNEL_STACK_EXPANSION
,
266 MI_USAGE_PAGE_DIRECTORY
,
267 MI_USAGE_LEGACY_PAGE_DIRECTORY
,
268 MI_USAGE_DRIVER_PAGE
,
269 MI_USAGE_CONTINOUS_ALLOCATION
,
271 MI_USAGE_DEMAND_ZERO
,
274 MI_USAGE_PFN_DATABASE
,
275 MI_USAGE_BOOT_DRIVER
,
276 MI_USAGE_INIT_MEMORY
,
281 // These two mappings are actually used by Windows itself, based on the ASSERTS
283 #define StartOfAllocation ReadInProgress
284 #define EndOfAllocation WriteInProgress
286 typedef struct _MMPFNENTRY
289 USHORT ReadInProgress
:1; // StartOfAllocation
290 USHORT WriteInProgress
:1; // EndOfAllocation
291 USHORT PrototypePte
:1;
293 USHORT PageLocation
:3;
294 USHORT RemovalRequested
:1;
295 USHORT CacheAttribute
:2;
297 USHORT ParityError
:1;
301 typedef struct _MMPFN
309 SINGLE_LIST_ENTRY NextStackPfn
;
318 ULONG_PTR ShareCount
;
324 USHORT ReferenceCount
;
329 USHORT ReferenceCount
;
336 LONG AweReferenceCount
;
339 PMM_RMAP_ENTRY RmapListHead
;
343 ULONG_PTR EntireFrame
;
346 ULONG_PTR PteFrame
:25;
347 ULONG_PTR InPageError
:1;
348 ULONG_PTR VerifierAllocation
:1;
349 ULONG_PTR AweAllocation
:1;
350 ULONG_PTR Priority
:3;
351 ULONG_PTR MustBeCached
:1;
355 MI_PFN_USAGES PfnUsage
;
356 CHAR ProcessName
[16];
359 // HACK until WS lists are supported
363 extern PMMPFN MmPfnDatabase
;
365 typedef struct _MMPFNLIST
371 } MMPFNLIST
, *PMMPFNLIST
;
373 extern MMPFNLIST MmZeroedPageListHead
;
374 extern MMPFNLIST MmFreePageListHead
;
375 extern MMPFNLIST MmStandbyPageListHead
;
376 extern MMPFNLIST MmModifiedPageListHead
;
377 extern MMPFNLIST MmModifiedNoWritePageListHead
;
379 typedef struct _MM_MEMORY_CONSUMER
383 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
384 } MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
386 typedef struct _MM_REGION
391 LIST_ENTRY RegionListEntry
;
392 } MM_REGION
, *PMM_REGION
;
395 /* Entry describing free pool memory */
396 typedef struct _MMFREE_POOL_ENTRY
401 struct _MMFREE_POOL_ENTRY
*Owner
;
402 } MMFREE_POOL_ENTRY
, *PMMFREE_POOL_ENTRY
;
404 /* Signature of a freed block */
405 #define MM_FREE_POOL_SIGNATURE 'ARM3'
407 /* Paged pool information */
408 typedef struct _MM_PAGED_POOL_INFO
410 PRTL_BITMAP PagedPoolAllocationMap
;
411 PRTL_BITMAP EndOfPagedPoolBitmap
;
412 PMMPTE FirstPteForPagedPool
;
413 PMMPTE LastPteForPagedPool
;
414 PMMPDE NextPdeForPagedPoolExpansion
;
416 SIZE_T PagedPoolCommit
;
417 SIZE_T AllocatedPagedPool
;
418 } MM_PAGED_POOL_INFO
, *PMM_PAGED_POOL_INFO
;
420 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
423 (*PMM_ALTER_REGION_FUNC
)(
424 PMMSUPPORT AddressSpace
,
434 (*PMM_FREE_PAGE_FUNC
)(
436 PMEMORY_AREA MemoryArea
,
444 // Mm copy support for Kd
456 // Determines if a given address is a session address
476 /* marea.c *******************************************************************/
481 PMMSUPPORT AddressSpace
,
486 PMEMORY_AREA
*Result
,
487 ULONG AllocationFlags
,
488 ULONG AllocationGranularity
493 MmLocateMemoryAreaByAddress(
494 PMMSUPPORT AddressSpace
,
501 PMMSUPPORT AddressSpace
,
502 PMEMORY_AREA MemoryArea
,
503 PMM_FREE_PAGE_FUNC FreePage
,
504 PVOID FreePageContext
509 MiRosCleanupMemoryArea(
515 MmLocateMemoryAreaByRegion(
516 PMMSUPPORT AddressSpace
,
524 PMMSUPPORT AddressSpace
,
526 ULONG_PTR Granularity
,
532 MiRosCheckMemoryAreas(
533 PMMSUPPORT AddressSpace
);
537 MiCheckAllProcessMemoryAreas(VOID
);
539 /* npool.c *******************************************************************/
543 MiInitializeNonPagedPool(VOID
);
548 IN POOL_TYPE PoolType
,
549 IN SIZE_T SizeInBytes
555 IN PVOID VirtualAddress
561 IN PVOID StartingAddress
564 /* pool.c *******************************************************************/
569 IN POOL_TYPE PoolType
,
570 IN ULONG CurrentMaxQuota
,
571 OUT PULONG NewMaxQuota
574 /* mdl.c *********************************************************************/
583 /* mminit.c ******************************************************************/
593 MmInitSystem(IN ULONG Phase
,
594 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
597 /* pagefile.c ****************************************************************/
601 MmAllocSwapPage(VOID
);
605 MmFreeSwapPage(SWAPENTRY Entry
);
609 MmInitPagingFile(VOID
);
613 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject
);
631 MmShowOutOfSpaceMessagePagingFile(VOID
);
636 _In_ PFN_NUMBER Page
,
637 _In_ ULONG PageFileIndex
,
638 _In_ ULONG_PTR PageFileOffset
);
640 /* process.c ****************************************************************/
644 MmInitializeProcessAddressSpace(
645 IN PEPROCESS Process
,
646 IN PEPROCESS Clone OPTIONAL
,
647 IN PVOID Section OPTIONAL
,
649 IN POBJECT_NAME_INFORMATION
*AuditName OPTIONAL
655 IN PEPROCESS Process
,
656 IN PINITIAL_PEB InitialPeb
,
663 IN PEPROCESS Process
,
664 IN PCLIENT_ID ClientId
,
665 IN PINITIAL_TEB InitialTeb
,
672 struct _EPROCESS
*Process
,
678 MmCleanProcessAddressSpace(IN PEPROCESS Process
);
682 MmDeleteProcessAddressSpace(IN PEPROCESS Process
);
686 MmGetSessionLocaleId(VOID
);
690 MmSetMemoryPriorityProcess(
691 IN PEPROCESS Process
,
692 IN UCHAR MemoryPriority
695 /* i386/pfault.c *************************************************************/
707 /* special.c *****************************************************************/
711 MiInitializeSpecialPool(VOID
);
716 IN SIZE_T NumberOfBytes
,
721 MmIsSpecialPoolAddress(
726 MmIsSpecialPoolAddressFree(
731 MmAllocateSpecialPool(
732 IN SIZE_T NumberOfBytes
,
734 IN POOL_TYPE PoolType
,
735 IN ULONG SpecialType
);
742 /* mm.c **********************************************************************/
747 IN BOOLEAN StoreInstruction
,
749 IN KPROCESSOR_MODE Mode
,
750 IN PVOID TrapInformation
753 /* kmap.c ********************************************************************/
762 /* process.c *****************************************************************/
766 MmCreateKernelStack(BOOLEAN GuiStack
, UCHAR Node
);
770 MmDeleteKernelStack(PVOID Stack
,
773 /* balace.c ******************************************************************/
777 MmInitializeMemoryConsumer(
779 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
)
784 MmInitializeBalancer(
785 ULONG NrAvailablePages
,
791 MmReleasePageMemoryConsumer(
798 MmRequestPageMemoryConsumer(
801 PPFN_NUMBER AllocatedPage
806 MiInitBalancerThread(VOID
);
810 MmRebalanceMemoryConsumers(VOID
);
812 /* rmap.c **************************************************************/
816 MmSetRmapListHeadPage(
818 struct _MM_RMAP_ENTRY
* ListHead
821 struct _MM_RMAP_ENTRY
*
823 MmGetRmapListHeadPage(PFN_NUMBER Page
);
829 struct _EPROCESS
*Process
,
838 VOID (*DeleteMapping
)(PVOID Context
, struct _EPROCESS
*Process
, PVOID Address
)
845 struct _EPROCESS
*Process
,
851 MmInitializeRmapList(VOID
);
855 MmSetCleanAllRmaps(PFN_NUMBER Page
);
859 MmSetDirtyAllRmaps(PFN_NUMBER Page
);
863 MmIsDirtyPageRmap(PFN_NUMBER Page
);
867 MmPageOutPhysicalAddress(PFN_NUMBER Page
);
869 /* freelist.c **********************************************************/
873 MiAcquirePfnLock(VOID
)
875 return KeAcquireQueuedSpinLock(LockQueuePfnLock
);
883 KeReleaseQueuedSpinLock(LockQueuePfnLock
, OldIrql
);
886 #define MI_ASSERT_PFN_LOCK_HELD() ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
890 MiGetPfnEntry(IN PFN_NUMBER Pfn
)
893 extern RTL_BITMAP MiPfnBitMap
;
895 /* Make sure the PFN number is valid */
896 if (Pfn
> MmHighestPhysicalPage
) return NULL
;
898 /* Make sure this page actually has a PFN entry */
899 if ((MiPfnBitMap
.Buffer
) && !(RtlTestBit(&MiPfnBitMap
, (ULONG
)Pfn
))) return NULL
;
902 Page
= &MmPfnDatabase
[Pfn
];
910 MiGetPfnEntryIndex(IN PMMPFN Pfn1
)
913 // This will return the Page Frame Number (PFN) from the MMPFN
915 return Pfn1
- MmPfnDatabase
;
920 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage
);
924 MmGetLRUFirstUserPage(VOID
);
928 MmInsertLRULastUserPage(PFN_NUMBER Page
);
932 MmRemoveLRUUserPage(PFN_NUMBER Page
);
936 MmDumpArmPfnDatabase(
937 IN BOOLEAN StatusOnly
946 /* hypermap.c *****************************************************************/
948 extern PEPROCESS HyperProcess
;
949 extern KIRQL HyperIrql
;
953 MiMapPageInHyperSpace(IN PEPROCESS Process
,
959 MiUnmapPageInHyperSpace(IN PEPROCESS Process
,
965 MiMapPagesInZeroSpace(IN PMMPFN Pfn1
,
966 IN PFN_NUMBER NumberOfPages
);
970 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress
,
971 IN PFN_NUMBER NumberOfPages
);
974 // ReactOS Compatibility Layer
978 MmCreateHyperspaceMapping(IN PFN_NUMBER Page
)
980 HyperProcess
= (PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
;
981 return MiMapPageInHyperSpace(HyperProcess
, Page
, &HyperIrql
);
984 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
986 /* i386/page.c *********************************************************/
990 MmCreateVirtualMapping(
991 struct _EPROCESS
* Process
,
1000 MmCreateVirtualMappingUnsafe(
1001 struct _EPROCESS
* Process
,
1011 struct _EPROCESS
* Process
,
1017 struct _EPROCESS
* Process
,
1025 struct _EPROCESS
* Process
,
1032 struct _EPROCESS
* Process
,
1038 MmInitGlobalKernelPageDirectory(VOID
);
1042 MmGetPageFileMapping(
1043 struct _EPROCESS
*Process
,
1045 SWAPENTRY
* SwapEntry
);
1049 MmDeletePageFileMapping(
1050 struct _EPROCESS
*Process
,
1052 SWAPENTRY
* SwapEntry
1057 MmCreatePageFileMapping(
1058 struct _EPROCESS
*Process
,
1066 struct _EPROCESS
*Process
,
1073 struct _EPROCESS
*Process
,
1085 MmDereferencePage(PFN_NUMBER Page
);
1089 MmReferencePage(PFN_NUMBER Page
);
1093 MmGetReferenceCountPage(PFN_NUMBER Page
);
1097 MmIsPageInUse(PFN_NUMBER Page
);
1101 MmSetSavedSwapEntryPage(
1103 SWAPENTRY SavedSwapEntry
);
1107 MmGetSavedSwapEntryPage(PFN_NUMBER Page
);
1112 struct _EPROCESS
*Process
,
1119 struct _EPROCESS
*Process
,
1126 struct _EPROCESS
*Process
,
1132 MmCreateProcessAddressSpace(
1135 IN PULONG_PTR DirectoryTableBase
1140 MmInitializeHandBuiltProcess(
1141 IN PEPROCESS Process
,
1142 IN PULONG_PTR DirectoryTableBase
1148 MmInitializeHandBuiltProcess2(
1149 IN PEPROCESS Process
1154 MmSetExecuteOptions(IN ULONG ExecuteOptions
);
1158 MmGetExecuteOptions(IN PULONG ExecuteOptions
);
1162 MmDeleteVirtualMapping(
1163 struct _EPROCESS
*Process
,
1172 struct _EPROCESS
*Process
,
1176 /* wset.c ********************************************************************/
1185 /* region.c ************************************************************/
1190 PMMSUPPORT AddressSpace
,
1192 PLIST_ENTRY RegionListHead
,
1197 PMM_ALTER_REGION_FUNC AlterFunc
1203 PLIST_ENTRY RegionListHead
,
1213 PLIST_ENTRY RegionListHead
,
1215 PVOID
* RegionBaseAddress
1218 /* section.c *****************************************************************/
1222 MmGetImageInformation(
1223 OUT PSECTION_IMAGE_INFORMATION ImageInformation
1228 MmGetFileObjectForSection(
1233 MmGetFileNameForAddress(
1235 OUT PUNICODE_STRING ModuleName
1240 MmGetFileNameForSection(
1242 OUT POBJECT_NAME_INFORMATION
*ModuleName
1248 PMEMORY_AREA MemoryArea
,
1250 PMEMORY_BASIC_INFORMATION Info
,
1251 PSIZE_T ResultLength
1256 MmProtectSectionView(
1257 PMMSUPPORT AddressSpace
,
1258 PMEMORY_AREA MemoryArea
,
1267 MmInitSectionImplementation(VOID
);
1271 MmNotPresentFaultSectionView(
1272 PMMSUPPORT AddressSpace
,
1273 MEMORY_AREA
* MemoryArea
,
1280 MmPageOutSectionView(
1281 PMMSUPPORT AddressSpace
,
1282 PMEMORY_AREA MemoryArea
,
1289 MmCreatePhysicalMemorySection(VOID
);
1293 MmAccessFaultSectionView(
1294 PMMSUPPORT AddressSpace
,
1295 MEMORY_AREA
* MemoryArea
,
1301 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
1303 /* sysldr.c ******************************************************************/
1307 MiReloadBootLoadedDrivers(
1308 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1313 MiInitializeLoadedModuleList(
1314 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1320 IN PUNICODE_STRING FileName
,
1321 IN PUNICODE_STRING NamePrefix OPTIONAL
,
1322 IN PUNICODE_STRING LoadedName OPTIONAL
,
1324 OUT PVOID
*ModuleObject
,
1325 OUT PVOID
*ImageBaseAddress
1330 MmUnloadSystemImage(
1331 IN PVOID ImageHandle
1337 IN HANDLE ImageHandle
,
1338 IN BOOLEAN PurgeSection
1343 MmCallDllInitialize(
1344 IN PLDR_DATA_TABLE_ENTRY LdrEntry
,
1345 IN PLIST_ENTRY ListHead
1349 /* procsup.c *****************************************************************/
1354 IN PVOID StackPointer
1360 MmLockAddressSpace(PMMSUPPORT AddressSpace
)
1362 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1367 MmUnlockAddressSpace(PMMSUPPORT AddressSpace
)
1369 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
)->AddressCreationLock
);
1374 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace
)
1376 if (AddressSpace
== MmKernelAddressSpace
) return NULL
;
1377 return CONTAINING_RECORD(AddressSpace
, EPROCESS
, Vm
);
1382 MmGetCurrentAddressSpace(VOID
)
1384 return &((PEPROCESS
)KeGetCurrentThread()->ApcState
.Process
)->Vm
;
1389 MmGetKernelAddressSpace(VOID
)
1391 return MmKernelAddressSpace
;
1395 /* expool.c ******************************************************************/
1399 ExpCheckPoolAllocation(
1410 /* mmsup.c *****************************************************************/
1414 MmAdjustWorkingSetSize(
1415 IN SIZE_T WorkingSetMinimumInBytes
,
1416 IN SIZE_T WorkingSetMaximumInBytes
,
1417 IN ULONG SystemCache
,
1418 IN BOOLEAN IncreaseOkay
);
1421 /* session.c *****************************************************************/
1423 _IRQL_requires_max_(APC_LEVEL
)
1427 _Inout_ PVOID SessionEntry
,
1428 _Out_ PKAPC_STATE ApcState
);
1430 _IRQL_requires_max_(APC_LEVEL
)
1434 _Inout_ PVOID SessionEntry
,
1435 _Out_ PKAPC_STATE ApcState
);
1440 _Inout_ PVOID SessionEntry
);
1445 _In_ ULONG SessionId
);
1447 _IRQL_requires_max_(APC_LEVEL
)
1450 MmSetSessionLocaleId(
1451 _In_ LCID LocaleId
);
1454 /* virtual.c *****************************************************************/
1458 MmCopyVirtualMemory(IN PEPROCESS SourceProcess
,
1459 IN PVOID SourceAddress
,
1460 IN PEPROCESS TargetProcess
,
1461 OUT PVOID TargetAddress
,
1462 IN SIZE_T BufferSize
,
1463 IN KPROCESSOR_MODE PreviousMode
,
1464 OUT PSIZE_T ReturnSize
);