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); \
179 #if (NTDDI_VERSION >= NTDDI_WIN2K)
182 PPHYSICAL_MEMORY_RANGE
184 MmGetPhysicalMemoryRanges(VOID
);
189 MmGetPhysicalAddress(
190 IN PVOID BaseAddress
);
195 MmIsNonPagedSystemAddressValid(
196 IN PVOID VirtualAddress
);
201 MmAllocateNonCachedMemory(
202 IN SIZE_T NumberOfBytes
);
207 MmFreeNonCachedMemory(
208 IN PVOID BaseAddress
,
209 IN SIZE_T NumberOfBytes
);
214 MmGetVirtualForPhysical(
215 IN PHYSICAL_ADDRESS PhysicalAddress
);
220 MmMapUserAddressesToPage(
221 IN PVOID BaseAddress
,
222 IN SIZE_T NumberOfBytes
,
223 IN PVOID PageAddress
);
229 IN PHYSICAL_ADDRESS PhysicalAddress
,
230 IN SIZE_T NumberOfBytes
,
231 IN MEMORY_CACHING_TYPE CacheType
);
236 MmMapViewInSessionSpace(
238 OUT PVOID
*MappedBase
,
239 IN OUT PSIZE_T ViewSize
);
244 MmMapViewInSystemSpace(
246 OUT PVOID
*MappedBase
,
247 IN OUT PSIZE_T ViewSize
);
253 IN PVOID VirtualAddress
);
258 MmIsThisAnNtAsSystem(VOID
);
263 MmLockPagableSectionByHandle(
264 IN PVOID ImageSectionHandle
);
269 MmUnmapViewInSessionSpace(
270 IN PVOID MappedBase
);
275 MmUnmapViewInSystemSpace(
276 IN PVOID MappedBase
);
281 MmUnsecureVirtualMemory(
282 IN HANDLE SecureHandle
);
287 MmRemovePhysicalMemory(
288 IN PPHYSICAL_ADDRESS StartAddress
,
289 IN OUT PLARGE_INTEGER NumberOfBytes
);
294 MmSecureVirtualMemory(
303 IN PVOID BaseAddress
,
304 IN SIZE_T NumberOfBytes
);
310 IN PPHYSICAL_ADDRESS StartAddress
,
311 IN OUT PLARGE_INTEGER NumberOfBytes
);
316 MmAllocateContiguousMemory(
317 IN SIZE_T NumberOfBytes
,
318 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
323 MmAllocateContiguousMemorySpecifyCache(
324 IN SIZE_T NumberOfBytes
,
325 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
326 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
327 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
328 IN MEMORY_CACHING_TYPE CacheType
);
333 MmAllocateContiguousMemorySpecifyCacheNode(
334 IN SIZE_T NumberOfBytes
,
335 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
336 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
337 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
338 IN MEMORY_CACHING_TYPE CacheType
,
339 IN NODE_REQUIREMENT PreferredNode
);
344 MmFreeContiguousMemory(
345 IN PVOID BaseAddress
);
350 MmFreeContiguousMemorySpecifyCache(
351 IN PVOID BaseAddress
,
352 IN SIZE_T NumberOfBytes
,
353 IN MEMORY_CACHING_TYPE CacheType
);
360 MmAllocateContiguousMemory(
361 IN SIZE_T NumberOfBytes
,
362 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
367 MmAllocateContiguousMemorySpecifyCache(
368 IN SIZE_T NumberOfBytes
,
369 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
370 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
371 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
372 IN MEMORY_CACHING_TYPE CacheType
);
377 MmAllocatePagesForMdl(
378 IN PHYSICAL_ADDRESS LowAddress
,
379 IN PHYSICAL_ADDRESS HighAddress
,
380 IN PHYSICAL_ADDRESS SkipBytes
,
381 IN SIZE_T TotalBytes
);
386 MmBuildMdlForNonPagedPool(
387 IN OUT PMDLX MemoryDescriptorList
);
389 //DECLSPEC_DEPRECATED_DDK
394 IN PMDL MemoryDescriptorList OPTIONAL
,
401 MmFreeContiguousMemory(
402 IN PVOID BaseAddress
);
407 MmFreeContiguousMemorySpecifyCache(
408 IN PVOID BaseAddress
,
409 IN SIZE_T NumberOfBytes
,
410 IN MEMORY_CACHING_TYPE CacheType
);
416 IN PMDLX MemoryDescriptorList
);
421 MmGetSystemRoutineAddress(
422 IN PUNICODE_STRING SystemRoutineName
);
428 IN
struct _DRIVER_OBJECT
*DriverObject
);
433 MmLockPagableDataSection(
434 IN PVOID AddressWithinSection
);
440 IN PHYSICAL_ADDRESS PhysicalAddress
,
441 IN SIZE_T NumberOfBytes
,
442 IN MEMORY_CACHING_TYPE CacheEnable
);
448 IN PMDL MemoryDescriptorList
,
449 IN KPROCESSOR_MODE AccessMode
);
454 MmMapLockedPagesSpecifyCache(
455 IN PMDLX MemoryDescriptorList
,
456 IN KPROCESSOR_MODE AccessMode
,
457 IN MEMORY_CACHING_TYPE CacheType
,
458 IN PVOID BaseAddress OPTIONAL
,
459 IN ULONG BugCheckOnFailure
,
460 IN MM_PAGE_PRIORITY Priority
);
466 IN PVOID AddressWithinSection
);
472 IN OUT PMDL MemoryDescriptorList
,
473 IN KPROCESSOR_MODE AccessMode
,
474 IN LOCK_OPERATION Operation
);
479 MmQuerySystemSize(VOID
);
485 IN PVOID AddressWithinSection
);
497 MmUnlockPagableImageSection(
498 IN PVOID ImageSectionHandle
);
504 IN OUT PMDL MemoryDescriptorList
);
510 IN PVOID BaseAddress
,
511 IN SIZE_T NumberOfBytes
);
516 MmProbeAndLockProcessPages(
517 IN OUT PMDL MemoryDescriptorList
,
518 IN PEPROCESS Process
,
519 IN KPROCESSOR_MODE AccessMode
,
520 IN LOCK_OPERATION Operation
);
526 IN PVOID BaseAddress
,
527 IN PMDL MemoryDescriptorList
);
532 MmAllocateContiguousMemorySpecifyCacheNode(
533 IN SIZE_T NumberOfBytes
,
534 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
535 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
536 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
537 IN MEMORY_CACHING_TYPE CacheType
,
538 IN NODE_REQUIREMENT PreferredNode
);
541 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
543 #if (NTDDI_VERSION >= NTDDI_WINXP)
550 IN ULONG NumberOfBytes
);
555 MmAllocateMappingAddress(
556 IN SIZE_T NumberOfBytes
,
562 MmFreeMappingAddress(
563 IN PVOID BaseAddress
,
570 OUT PULONG VerifierFlags
);
575 MmMapLockedPagesWithReservedMapping(
576 IN PVOID MappingAddress
,
578 IN PMDL MemoryDescriptorList
,
579 IN MEMORY_CACHING_TYPE CacheType
);
584 MmProtectMdlSystemAddress(
585 IN PMDL MemoryDescriptorList
,
586 IN ULONG NewProtect
);
591 MmUnmapReservedMapping(
592 IN PVOID BaseAddress
,
594 IN PMDL MemoryDescriptorList
);
600 IN PVOID ThunkBuffer
,
601 IN ULONG ThunkBufferSize
);
603 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
605 #if (NTDDI_VERSION >= NTDDI_WS03)
610 MmCreateMirror(VOID
);
617 IN PHYSICAL_ADDRESS StartAddress
,
618 IN SIZE_T NumberOfBytes
);
623 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
627 MmAllocatePagesForMdlEx(
628 IN PHYSICAL_ADDRESS LowAddress
,
629 IN PHYSICAL_ADDRESS HighAddress
,
630 IN PHYSICAL_ADDRESS SkipBytes
,
631 IN SIZE_T TotalBytes
,
632 IN MEMORY_CACHING_TYPE CacheType
,
637 #if (NTDDI_VERSION >= NTDDI_VISTA)
641 MmRotatePhysicalView(
642 IN PVOID VirtualAddress
,
643 IN OUT PSIZE_T NumberOfBytes
,
644 IN PMDLX NewMdl OPTIONAL
,
645 IN MM_ROTATE_DIRECTION Direction
,
646 IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction
,
647 IN PVOID Context OPTIONAL
);
654 MmIsDriverVerifyingByAddress(
655 IN PVOID AddressWithinSection
);