1 /******************************************************************************
2 * Memory manager Functions *
3 ******************************************************************************/
8 #define ALIGN_DOWN_BY(size, align) \
9 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
11 #define ALIGN_UP_BY(size, align) \
12 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
14 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
15 ((PVOID)ALIGN_DOWN_BY(ptr, align))
17 #define ALIGN_UP_POINTER_BY(ptr, align) \
18 ((PVOID)ALIGN_UP_BY(ptr, align))
20 #define ALIGN_DOWN(size, type) \
21 ALIGN_DOWN_BY(size, sizeof(type))
23 #define ALIGN_UP(size, type) \
24 ALIGN_UP_BY(size, sizeof(type))
26 #define ALIGN_DOWN_POINTER(ptr, type) \
27 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
29 #define ALIGN_UP_POINTER(ptr, type) \
30 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
36 #define BYTE_OFFSET(Va) \
37 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
43 #define BYTES_TO_PAGES(Size) \
44 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
50 #define PAGE_ALIGN(Va) \
51 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
57 #define ROUND_TO_PAGES(Size) \
58 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
61 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
65 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
66 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
67 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
74 #define MmGetMdlByteCount(_Mdl) \
82 #define MmGetMdlByteOffset(_Mdl) \
90 #define MmGetMdlPfnArray(_Mdl) \
91 ((PPFN_NUMBER) ((_Mdl) + 1))
95 * MmGetMdlVirtualAddress(
98 #define MmGetMdlVirtualAddress(_Mdl) \
99 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
101 #define MmGetProcedureAddress(Address) (Address)
103 /* PVOID MmGetSystemAddressForMdl(
106 #define MmGetSystemAddressForMdl(Mdl) \
107 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
108 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
109 ((Mdl)->MappedSystemVa) : \
110 (MmMapLockedPages((Mdl), KernelMode)))
113 * MmGetSystemAddressForMdlSafe(
115 * IN MM_PAGE_PRIORITY Priority)
117 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
118 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
119 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
120 (_Mdl)->MappedSystemVa : \
121 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
122 KernelMode, MmCached, NULL, FALSE, (_Priority)))
127 * IN PMDL MemoryDescriptorList,
131 #define MmInitializeMdl(_MemoryDescriptorList, \
135 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
136 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
137 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
138 (_MemoryDescriptorList)->MdlFlags = 0; \
139 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
140 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
141 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
146 * MmPrepareMdlForReuse(
149 #define MmPrepareMdlForReuse(_Mdl) \
151 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
152 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
153 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
154 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
155 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
159 #if (NTDDI_VERSION >= NTDDI_WIN2K)
164 MmAllocateContiguousMemory(
165 IN SIZE_T NumberOfBytes
,
166 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
171 MmAllocateContiguousMemorySpecifyCache(
172 IN SIZE_T NumberOfBytes
,
173 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
174 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
175 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
176 IN MEMORY_CACHING_TYPE CacheType
);
181 MmAllocatePagesForMdl(
182 IN PHYSICAL_ADDRESS LowAddress
,
183 IN PHYSICAL_ADDRESS HighAddress
,
184 IN PHYSICAL_ADDRESS SkipBytes
,
185 IN SIZE_T TotalBytes
);
190 MmBuildMdlForNonPagedPool(
191 IN OUT PMDLX MemoryDescriptorList
);
193 //DECLSPEC_DEPRECATED_DDK
198 IN PMDL MemoryDescriptorList OPTIONAL
,
205 MmFreeContiguousMemory(
206 IN PVOID BaseAddress
);
211 MmFreeContiguousMemorySpecifyCache(
212 IN PVOID BaseAddress
,
213 IN SIZE_T NumberOfBytes
,
214 IN MEMORY_CACHING_TYPE CacheType
);
220 IN PMDLX MemoryDescriptorList
);
225 MmGetSystemRoutineAddress(
226 IN PUNICODE_STRING SystemRoutineName
);
232 IN
struct _DRIVER_OBJECT
*DriverObject
);
237 MmLockPagableDataSection(
238 IN PVOID AddressWithinSection
);
244 IN PHYSICAL_ADDRESS PhysicalAddress
,
245 IN SIZE_T NumberOfBytes
,
246 IN MEMORY_CACHING_TYPE CacheEnable
);
252 IN PMDL MemoryDescriptorList
,
253 IN KPROCESSOR_MODE AccessMode
);
258 MmMapLockedPagesSpecifyCache(
259 IN PMDLX MemoryDescriptorList
,
260 IN KPROCESSOR_MODE AccessMode
,
261 IN MEMORY_CACHING_TYPE CacheType
,
262 IN PVOID BaseAddress OPTIONAL
,
263 IN ULONG BugCheckOnFailure
,
264 IN MM_PAGE_PRIORITY Priority
);
270 IN PVOID AddressWithinSection
);
276 IN OUT PMDL MemoryDescriptorList
,
277 IN KPROCESSOR_MODE AccessMode
,
278 IN LOCK_OPERATION Operation
);
290 IN PVOID AddressWithinSection
);
302 MmUnlockPagableImageSection(
303 IN PVOID ImageSectionHandle
);
309 IN OUT PMDL MemoryDescriptorList
);
315 IN PVOID BaseAddress
,
316 IN SIZE_T NumberOfBytes
);
321 MmProbeAndLockProcessPages(
322 IN OUT PMDL MemoryDescriptorList
,
323 IN PEPROCESS Process
,
324 IN KPROCESSOR_MODE AccessMode
,
325 IN LOCK_OPERATION Operation
);
331 IN PVOID BaseAddress
,
332 IN PMDL MemoryDescriptorList
);
336 #if (NTDDI_VERSION >= NTDDI_WINXP)
343 IN ULONG NumberOfBytes
);
348 MmAllocateMappingAddress(
349 IN SIZE_T NumberOfBytes
,
355 MmFreeMappingAddress(
356 IN PVOID BaseAddress
,
363 OUT PULONG VerifierFlags
);
368 MmMapLockedPagesWithReservedMapping(
369 IN PVOID MappingAddress
,
371 IN PMDL MemoryDescriptorList
,
372 IN MEMORY_CACHING_TYPE CacheType
);
377 MmProtectMdlSystemAddress(
378 IN PMDL MemoryDescriptorList
,
379 IN ULONG NewProtect
);
384 MmUnmapReservedMapping(
385 IN PVOID BaseAddress
,
387 IN PMDL MemoryDescriptorList
);
391 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
395 MmAllocatePagesForMdlEx(
396 IN PHYSICAL_ADDRESS LowAddress
,
397 IN PHYSICAL_ADDRESS HighAddress
,
398 IN PHYSICAL_ADDRESS SkipBytes
,
399 IN SIZE_T TotalBytes
,
400 IN MEMORY_CACHING_TYPE CacheType
,