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)
121 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
123 /* PVOID MmGetSystemAddressForMdl(
126 #define MmGetSystemAddressForMdl(Mdl) \
127 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
128 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
129 ((Mdl)->MappedSystemVa) : \
130 (MmMapLockedPages((Mdl), KernelMode)))
133 * MmGetSystemAddressForMdlSafe(
135 * IN MM_PAGE_PRIORITY Priority)
137 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
138 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
139 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
140 (_Mdl)->MappedSystemVa : \
141 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
142 KernelMode, MmCached, NULL, FALSE, (_Priority)))
147 * IN PMDL MemoryDescriptorList,
151 #define MmInitializeMdl(_MemoryDescriptorList, \
155 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
156 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
157 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
158 (_MemoryDescriptorList)->MdlFlags = 0; \
159 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
160 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
161 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
166 * MmPrepareMdlForReuse(
169 #define MmPrepareMdlForReuse(_Mdl) \
171 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
172 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
173 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
174 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
175 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
187 //__assume_bound(TagBase); // FIXME
188 return ((ULONG
)((TagBase
) + ((Tag
) << HEAP_TAG_SHIFT
)));
192 #if (NTDDI_VERSION >= NTDDI_WIN2K)
197 MmAllocateContiguousMemory(
198 IN SIZE_T NumberOfBytes
,
199 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
204 MmAllocateContiguousMemorySpecifyCache(
205 IN SIZE_T NumberOfBytes
,
206 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
207 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
208 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
209 IN MEMORY_CACHING_TYPE CacheType
);
214 MmAllocatePagesForMdl(
215 IN PHYSICAL_ADDRESS LowAddress
,
216 IN PHYSICAL_ADDRESS HighAddress
,
217 IN PHYSICAL_ADDRESS SkipBytes
,
218 IN SIZE_T TotalBytes
);
223 MmBuildMdlForNonPagedPool(
224 IN OUT PMDLX MemoryDescriptorList
);
226 //DECLSPEC_DEPRECATED_DDK
231 IN PMDL MemoryDescriptorList OPTIONAL
,
238 MmFreeContiguousMemory(
239 IN PVOID BaseAddress
);
244 MmFreeContiguousMemorySpecifyCache(
245 IN PVOID BaseAddress
,
246 IN SIZE_T NumberOfBytes
,
247 IN MEMORY_CACHING_TYPE CacheType
);
253 IN PMDLX MemoryDescriptorList
);
258 MmGetSystemRoutineAddress(
259 IN PUNICODE_STRING SystemRoutineName
);
265 IN
struct _DRIVER_OBJECT
*DriverObject
);
270 MmLockPagableDataSection(
271 IN PVOID AddressWithinSection
);
277 IN PHYSICAL_ADDRESS PhysicalAddress
,
278 IN SIZE_T NumberOfBytes
,
279 IN MEMORY_CACHING_TYPE CacheEnable
);
285 IN PMDL MemoryDescriptorList
,
286 IN KPROCESSOR_MODE AccessMode
);
291 MmMapLockedPagesSpecifyCache(
292 IN PMDLX MemoryDescriptorList
,
293 IN KPROCESSOR_MODE AccessMode
,
294 IN MEMORY_CACHING_TYPE CacheType
,
295 IN PVOID BaseAddress OPTIONAL
,
296 IN ULONG BugCheckOnFailure
,
297 IN MM_PAGE_PRIORITY Priority
);
303 IN PVOID AddressWithinSection
);
309 IN OUT PMDL MemoryDescriptorList
,
310 IN KPROCESSOR_MODE AccessMode
,
311 IN LOCK_OPERATION Operation
);
316 MmQuerySystemSize(VOID
);
322 IN PVOID AddressWithinSection
);
334 MmUnlockPagableImageSection(
335 IN PVOID ImageSectionHandle
);
341 IN OUT PMDL MemoryDescriptorList
);
347 IN PVOID BaseAddress
,
348 IN SIZE_T NumberOfBytes
);
353 MmProbeAndLockProcessPages(
354 IN OUT PMDL MemoryDescriptorList
,
355 IN PEPROCESS Process
,
356 IN KPROCESSOR_MODE AccessMode
,
357 IN LOCK_OPERATION Operation
);
363 IN PVOID BaseAddress
,
364 IN PMDL MemoryDescriptorList
);
369 MmAllocateContiguousMemorySpecifyCacheNode(
370 IN SIZE_T NumberOfBytes
,
371 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
372 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
373 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
374 IN MEMORY_CACHING_TYPE CacheType
,
375 IN NODE_REQUIREMENT PreferredNode
);
380 PPHYSICAL_MEMORY_RANGE
382 MmGetPhysicalMemoryRanges(VOID
);
387 MmGetPhysicalAddress(
388 IN PVOID BaseAddress
);
393 MmIsNonPagedSystemAddressValid(
394 IN PVOID VirtualAddress
);
399 MmAllocateNonCachedMemory(
400 IN SIZE_T NumberOfBytes
);
405 MmFreeNonCachedMemory(
406 IN PVOID BaseAddress
,
407 IN SIZE_T NumberOfBytes
);
412 MmGetVirtualForPhysical(
413 IN PHYSICAL_ADDRESS PhysicalAddress
);
418 MmMapUserAddressesToPage(
419 IN PVOID BaseAddress
,
420 IN SIZE_T NumberOfBytes
,
421 IN PVOID PageAddress
);
427 IN PHYSICAL_ADDRESS PhysicalAddress
,
428 IN SIZE_T NumberOfBytes
,
429 IN MEMORY_CACHING_TYPE CacheType
);
434 MmMapViewInSessionSpace(
436 OUT PVOID
*MappedBase
,
437 IN OUT PSIZE_T ViewSize
);
442 MmMapViewInSystemSpace(
444 OUT PVOID
*MappedBase
,
445 IN OUT PSIZE_T ViewSize
);
451 IN PVOID VirtualAddress
);
456 MmIsThisAnNtAsSystem(VOID
);
461 MmLockPagableSectionByHandle(
462 IN PVOID ImageSectionHandle
);
467 MmUnmapViewInSessionSpace(
468 IN PVOID MappedBase
);
473 MmUnmapViewInSystemSpace(
474 IN PVOID MappedBase
);
479 MmUnsecureVirtualMemory(
480 IN HANDLE SecureHandle
);
485 MmRemovePhysicalMemory(
486 IN PPHYSICAL_ADDRESS StartAddress
,
487 IN OUT PLARGE_INTEGER NumberOfBytes
);
492 MmSecureVirtualMemory(
501 IN PVOID BaseAddress
,
502 IN SIZE_T NumberOfBytes
);
508 IN PPHYSICAL_ADDRESS StartAddress
,
509 IN OUT PLARGE_INTEGER NumberOfBytes
);
514 MmAllocateContiguousMemory(
515 IN SIZE_T NumberOfBytes
,
516 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
521 MmAllocateContiguousMemorySpecifyCache(
522 IN SIZE_T NumberOfBytes
,
523 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
524 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
525 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
526 IN MEMORY_CACHING_TYPE CacheType
);
531 MmAllocateContiguousMemorySpecifyCacheNode(
532 IN SIZE_T NumberOfBytes
,
533 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
534 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
535 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
536 IN MEMORY_CACHING_TYPE CacheType
,
537 IN NODE_REQUIREMENT PreferredNode
);
542 MmFreeContiguousMemory(
543 IN PVOID BaseAddress
);
548 MmFreeContiguousMemorySpecifyCache(
549 IN PVOID BaseAddress
,
550 IN SIZE_T NumberOfBytes
,
551 IN MEMORY_CACHING_TYPE CacheType
);
558 MmIsRecursiveIoFault(
564 MmForceSectionClosed(
565 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
566 IN BOOLEAN DelayClose
);
572 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
573 IN MMFLUSH_TYPE FlushType
);
578 MmCanFileBeTruncated(
579 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
580 IN PLARGE_INTEGER NewFileSize OPTIONAL
);
585 MmSetAddressRangeModified(
590 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
592 $
if (_WDMDDK_
|| _NTIFS_
)
593 #if (NTDDI_VERSION >= NTDDI_WINXP)
602 IN ULONG NumberOfBytes
);
607 MmAllocateMappingAddress(
608 IN SIZE_T NumberOfBytes
,
614 MmFreeMappingAddress(
615 IN PVOID BaseAddress
,
622 OUT PULONG VerifierFlags
);
627 MmMapLockedPagesWithReservedMapping(
628 IN PVOID MappingAddress
,
630 IN PMDL MemoryDescriptorList
,
631 IN MEMORY_CACHING_TYPE CacheType
);
636 MmProtectMdlSystemAddress(
637 IN PMDL MemoryDescriptorList
,
638 IN ULONG NewProtect
);
643 MmUnmapReservedMapping(
644 IN PVOID BaseAddress
,
646 IN PMDL MemoryDescriptorList
);
652 IN PVOID ThunkBuffer
,
653 IN ULONG ThunkBufferSize
);
661 IN ULONG NumberOfLists
,
662 IN PREAD_LIST
*ReadLists
);
665 $
if (_WDMDDK_
|| _NTIFS_
)
666 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
668 $
if (_WDMDDK_
|| _NTDDK_
)
669 #if (NTDDI_VERSION >= NTDDI_WS03)
676 IN PHYSICAL_ADDRESS StartAddress
,
677 IN SIZE_T NumberOfBytes
);
684 MmCreateMirror(VOID
);
686 $
if (_WDMDDK_
|| _NTDDK_
)
687 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
690 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
694 MmAllocatePagesForMdlEx(
695 IN PHYSICAL_ADDRESS LowAddress
,
696 IN PHYSICAL_ADDRESS HighAddress
,
697 IN PHYSICAL_ADDRESS SkipBytes
,
698 IN SIZE_T TotalBytes
,
699 IN MEMORY_CACHING_TYPE CacheType
,
704 #if (NTDDI_VERSION >= NTDDI_VISTA)
709 MmIsDriverVerifyingByAddress(
710 IN PVOID AddressWithinSection
);
715 MmRotatePhysicalView(
716 IN PVOID VirtualAddress
,
717 IN OUT PSIZE_T NumberOfBytes
,
718 IN PMDLX NewMdl OPTIONAL
,
719 IN MM_ROTATE_DIRECTION Direction
,
720 IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction
,
721 IN PVOID Context OPTIONAL
);
728 MmDoesFileHaveUserWritableReferences(
729 IN PSECTION_OBJECT_POINTERS SectionPointer
);
731 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */