1 /******************************************************************************
2 * Memory manager Functions *
3 ******************************************************************************/
6 #define ALIGN_DOWN_BY(size, align) \
7 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
9 #define ALIGN_UP_BY(size, align) \
10 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
12 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
13 ((PVOID)ALIGN_DOWN_BY(ptr, align))
15 #define ALIGN_UP_POINTER_BY(ptr, align) \
16 ((PVOID)ALIGN_UP_BY(ptr, align))
18 #define ALIGN_DOWN(size, type) \
19 ALIGN_DOWN_BY(size, sizeof(type))
21 #define ALIGN_UP(size, type) \
22 ALIGN_UP_BY(size, sizeof(type))
24 #define ALIGN_DOWN_POINTER(ptr, type) \
25 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
27 #define ALIGN_UP_POINTER(ptr, type) \
28 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
31 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
35 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
38 #define POOL_TAGGING 1
41 #define IF_DEBUG if (TRUE)
43 #define IF_DEBUG if (FALSE)
50 #define BYTE_OFFSET(Va) \
51 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
57 #define BYTES_TO_PAGES(Size) \
58 (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
64 #define PAGE_ALIGN(Va) \
65 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
71 #define ROUND_TO_PAGES(Size) \
72 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
75 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
79 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
80 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
81 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
83 #define COMPUTE_PAGES_SPANNED(Va, Size) \
84 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
91 #define MmGetMdlByteCount(_Mdl) \
99 #define MmGetMdlByteOffset(_Mdl) \
102 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
109 #define MmGetMdlPfnArray(_Mdl) \
110 ((PPFN_NUMBER) ((_Mdl) + 1))
114 * MmGetMdlVirtualAddress(
117 #define MmGetMdlVirtualAddress(_Mdl) \
118 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
120 #define MmGetProcedureAddress(Address) (Address)
122 /* PVOID MmGetSystemAddressForMdl(
125 #define MmGetSystemAddressForMdl(Mdl) \
126 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
127 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
128 ((Mdl)->MappedSystemVa) : \
129 (MmMapLockedPages((Mdl), KernelMode)))
132 * MmGetSystemAddressForMdlSafe(
134 * IN MM_PAGE_PRIORITY Priority)
136 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
137 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
138 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
139 (_Mdl)->MappedSystemVa : \
140 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
141 KernelMode, MmCached, NULL, FALSE, (_Priority)))
146 * IN PMDL MemoryDescriptorList,
150 #define MmInitializeMdl(_MemoryDescriptorList, \
154 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
155 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
156 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
157 (_MemoryDescriptorList)->MdlFlags = 0; \
158 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
159 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
160 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
165 * MmPrepareMdlForReuse(
168 #define MmPrepareMdlForReuse(_Mdl) \
170 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
171 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
172 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
173 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
174 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
186 //__assume_bound(TagBase); // FIXME
187 return ((ULONG
)((TagBase
) + ((Tag
) << HEAP_TAG_SHIFT
)));
191 #if (NTDDI_VERSION >= NTDDI_WIN2K)
196 MmAllocateContiguousMemory(
197 IN SIZE_T NumberOfBytes
,
198 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
203 MmAllocateContiguousMemorySpecifyCache(
204 IN SIZE_T NumberOfBytes
,
205 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
206 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
207 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
208 IN MEMORY_CACHING_TYPE CacheType
);
213 MmAllocatePagesForMdl(
214 IN PHYSICAL_ADDRESS LowAddress
,
215 IN PHYSICAL_ADDRESS HighAddress
,
216 IN PHYSICAL_ADDRESS SkipBytes
,
217 IN SIZE_T TotalBytes
);
222 MmBuildMdlForNonPagedPool(
223 IN OUT PMDLX MemoryDescriptorList
);
225 //DECLSPEC_DEPRECATED_DDK
230 IN PMDL MemoryDescriptorList OPTIONAL
,
237 MmFreeContiguousMemory(
238 IN PVOID BaseAddress
);
243 MmFreeContiguousMemorySpecifyCache(
244 IN PVOID BaseAddress
,
245 IN SIZE_T NumberOfBytes
,
246 IN MEMORY_CACHING_TYPE CacheType
);
252 IN PMDLX MemoryDescriptorList
);
257 MmGetSystemRoutineAddress(
258 IN PUNICODE_STRING SystemRoutineName
);
264 IN
struct _DRIVER_OBJECT
*DriverObject
);
269 MmLockPagableDataSection(
270 IN PVOID AddressWithinSection
);
276 IN PHYSICAL_ADDRESS PhysicalAddress
,
277 IN SIZE_T NumberOfBytes
,
278 IN MEMORY_CACHING_TYPE CacheEnable
);
284 IN PMDL MemoryDescriptorList
,
285 IN KPROCESSOR_MODE AccessMode
);
290 MmMapLockedPagesSpecifyCache(
291 IN PMDLX MemoryDescriptorList
,
292 IN KPROCESSOR_MODE AccessMode
,
293 IN MEMORY_CACHING_TYPE CacheType
,
294 IN PVOID BaseAddress OPTIONAL
,
295 IN ULONG BugCheckOnFailure
,
296 IN MM_PAGE_PRIORITY Priority
);
302 IN PVOID AddressWithinSection
);
308 IN OUT PMDL MemoryDescriptorList
,
309 IN KPROCESSOR_MODE AccessMode
,
310 IN LOCK_OPERATION Operation
);
315 MmQuerySystemSize(VOID
);
321 IN PVOID AddressWithinSection
);
333 MmUnlockPagableImageSection(
334 IN PVOID ImageSectionHandle
);
340 IN OUT PMDL MemoryDescriptorList
);
346 IN PVOID BaseAddress
,
347 IN SIZE_T NumberOfBytes
);
352 MmProbeAndLockProcessPages(
353 IN OUT PMDL MemoryDescriptorList
,
354 IN PEPROCESS Process
,
355 IN KPROCESSOR_MODE AccessMode
,
356 IN LOCK_OPERATION Operation
);
362 IN PVOID BaseAddress
,
363 IN PMDL MemoryDescriptorList
);
368 MmAllocateContiguousMemorySpecifyCacheNode(
369 IN SIZE_T NumberOfBytes
,
370 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
371 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
372 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
373 IN MEMORY_CACHING_TYPE CacheType
,
374 IN NODE_REQUIREMENT PreferredNode
);
379 PPHYSICAL_MEMORY_RANGE
381 MmGetPhysicalMemoryRanges(VOID
);
386 MmGetPhysicalAddress(
387 IN PVOID BaseAddress
);
392 MmIsNonPagedSystemAddressValid(
393 IN PVOID VirtualAddress
);
398 MmAllocateNonCachedMemory(
399 IN SIZE_T NumberOfBytes
);
404 MmFreeNonCachedMemory(
405 IN PVOID BaseAddress
,
406 IN SIZE_T NumberOfBytes
);
411 MmGetVirtualForPhysical(
412 IN PHYSICAL_ADDRESS PhysicalAddress
);
417 MmMapUserAddressesToPage(
418 IN PVOID BaseAddress
,
419 IN SIZE_T NumberOfBytes
,
420 IN PVOID PageAddress
);
426 IN PHYSICAL_ADDRESS PhysicalAddress
,
427 IN SIZE_T NumberOfBytes
,
428 IN MEMORY_CACHING_TYPE CacheType
);
433 MmMapViewInSessionSpace(
435 OUT PVOID
*MappedBase
,
436 IN OUT PSIZE_T ViewSize
);
441 MmMapViewInSystemSpace(
443 OUT PVOID
*MappedBase
,
444 IN OUT PSIZE_T ViewSize
);
450 IN PVOID VirtualAddress
);
455 MmIsThisAnNtAsSystem(VOID
);
460 MmLockPagableSectionByHandle(
461 IN PVOID ImageSectionHandle
);
466 MmUnmapViewInSessionSpace(
467 IN PVOID MappedBase
);
472 MmUnmapViewInSystemSpace(
473 IN PVOID MappedBase
);
478 MmUnsecureVirtualMemory(
479 IN HANDLE SecureHandle
);
484 MmRemovePhysicalMemory(
485 IN PPHYSICAL_ADDRESS StartAddress
,
486 IN OUT PLARGE_INTEGER NumberOfBytes
);
491 MmSecureVirtualMemory(
500 IN PVOID BaseAddress
,
501 IN SIZE_T NumberOfBytes
);
507 IN PPHYSICAL_ADDRESS StartAddress
,
508 IN OUT PLARGE_INTEGER NumberOfBytes
);
513 MmAllocateContiguousMemory(
514 IN SIZE_T NumberOfBytes
,
515 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
520 MmAllocateContiguousMemorySpecifyCache(
521 IN SIZE_T NumberOfBytes
,
522 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
523 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
524 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
525 IN MEMORY_CACHING_TYPE CacheType
);
530 MmAllocateContiguousMemorySpecifyCacheNode(
531 IN SIZE_T NumberOfBytes
,
532 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
533 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
534 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
535 IN MEMORY_CACHING_TYPE CacheType
,
536 IN NODE_REQUIREMENT PreferredNode
);
541 MmFreeContiguousMemory(
542 IN PVOID BaseAddress
);
547 MmFreeContiguousMemorySpecifyCache(
548 IN PVOID BaseAddress
,
549 IN SIZE_T NumberOfBytes
,
550 IN MEMORY_CACHING_TYPE CacheType
);
557 MmIsRecursiveIoFault(
563 MmForceSectionClosed(
564 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
565 IN BOOLEAN DelayClose
);
571 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
572 IN MMFLUSH_TYPE FlushType
);
577 MmCanFileBeTruncated(
578 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
579 IN PLARGE_INTEGER NewFileSize OPTIONAL
);
584 MmSetAddressRangeModified(
589 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
591 $
if (_WDMDDK_
|| _NTIFS_
)
592 #if (NTDDI_VERSION >= NTDDI_WINXP)
601 IN ULONG NumberOfBytes
);
606 MmAllocateMappingAddress(
607 IN SIZE_T NumberOfBytes
,
613 MmFreeMappingAddress(
614 IN PVOID BaseAddress
,
621 OUT PULONG VerifierFlags
);
626 MmMapLockedPagesWithReservedMapping(
627 IN PVOID MappingAddress
,
629 IN PMDL MemoryDescriptorList
,
630 IN MEMORY_CACHING_TYPE CacheType
);
635 MmProtectMdlSystemAddress(
636 IN PMDL MemoryDescriptorList
,
637 IN ULONG NewProtect
);
642 MmUnmapReservedMapping(
643 IN PVOID BaseAddress
,
645 IN PMDL MemoryDescriptorList
);
651 IN PVOID ThunkBuffer
,
652 IN ULONG ThunkBufferSize
);
660 IN ULONG NumberOfLists
,
661 IN PREAD_LIST
*ReadLists
);
664 $
if (_WDMDDK_
|| _NTIFS_
)
665 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
667 $
if (_WDMDDK_
|| _NTDDK_
)
668 #if (NTDDI_VERSION >= NTDDI_WS03)
675 IN PHYSICAL_ADDRESS StartAddress
,
676 IN SIZE_T NumberOfBytes
);
683 MmCreateMirror(VOID
);
685 $
if (_WDMDDK_
|| _NTDDK_
)
686 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
689 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
693 MmAllocatePagesForMdlEx(
694 IN PHYSICAL_ADDRESS LowAddress
,
695 IN PHYSICAL_ADDRESS HighAddress
,
696 IN PHYSICAL_ADDRESS SkipBytes
,
697 IN SIZE_T TotalBytes
,
698 IN MEMORY_CACHING_TYPE CacheType
,
703 #if (NTDDI_VERSION >= NTDDI_VISTA)
708 MmIsDriverVerifyingByAddress(
709 IN PVOID AddressWithinSection
);
714 MmRotatePhysicalView(
715 IN PVOID VirtualAddress
,
716 IN OUT PSIZE_T NumberOfBytes
,
717 IN PMDLX NewMdl OPTIONAL
,
718 IN MM_ROTATE_DIRECTION Direction
,
719 IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction
,
720 IN PVOID Context OPTIONAL
);
727 MmDoesFileHaveUserWritableReferences(
728 IN PSECTION_OBJECT_POINTERS SectionPointer
);
730 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */