[PSDK]
[reactos.git] / include / xdk / mmfuncs.h
1 /******************************************************************************
2 * Memory manager Functions *
3 ******************************************************************************/
4
5 /*
6 * Alignment Macros
7 */
8 #define ALIGN_DOWN_BY(size, align) \
9 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
10
11 #define ALIGN_UP_BY(size, align) \
12 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
13
14 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
15 ((PVOID)ALIGN_DOWN_BY(ptr, align))
16
17 #define ALIGN_UP_POINTER_BY(ptr, align) \
18 ((PVOID)ALIGN_UP_BY(ptr, align))
19
20 #define ALIGN_DOWN(size, type) \
21 ALIGN_DOWN_BY(size, sizeof(type))
22
23 #define ALIGN_UP(size, type) \
24 ALIGN_UP_BY(size, sizeof(type))
25
26 #define ALIGN_DOWN_POINTER(ptr, type) \
27 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
28
29 #define ALIGN_UP_POINTER(ptr, type) \
30 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
31
32 /* ULONG
33 * BYTE_OFFSET(
34 * IN PVOID Va)
35 */
36 #define BYTE_OFFSET(Va) \
37 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
38
39 /* ULONG
40 * BYTES_TO_PAGES(
41 * IN ULONG Size)
42 */
43 #define BYTES_TO_PAGES(Size) \
44 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
45
46 /* PVOID
47 * PAGE_ALIGN(
48 * IN PVOID Va)
49 */
50 #define PAGE_ALIGN(Va) \
51 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
52
53 /* ULONG_PTR
54 * ROUND_TO_PAGES(
55 * IN ULONG_PTR Size)
56 */
57 #define ROUND_TO_PAGES(Size) \
58 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
59
60 /* ULONG
61 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
62 * IN PVOID Va,
63 * IN ULONG Size)
64 */
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))
68
69 /*
70 * ULONG
71 * MmGetMdlByteCount(
72 * IN PMDL Mdl)
73 */
74 #define MmGetMdlByteCount(_Mdl) \
75 ((_Mdl)->ByteCount)
76
77 /*
78 * ULONG
79 * MmGetMdlByteOffset(
80 * IN PMDL Mdl)
81 */
82 #define MmGetMdlByteOffset(_Mdl) \
83 ((_Mdl)->ByteOffset)
84
85 /*
86 * PPFN_NUMBER
87 * MmGetMdlPfnArray(
88 * IN PMDL Mdl)
89 */
90 #define MmGetMdlPfnArray(_Mdl) \
91 ((PPFN_NUMBER) ((_Mdl) + 1))
92
93 /*
94 * PVOID
95 * MmGetMdlVirtualAddress(
96 * IN PMDL Mdl)
97 */
98 #define MmGetMdlVirtualAddress(_Mdl) \
99 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
100
101 #define MmGetProcedureAddress(Address) (Address)
102
103 /* PVOID MmGetSystemAddressForMdl(
104 * IN PMDL Mdl);
105 */
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)))
111
112 /* PVOID
113 * MmGetSystemAddressForMdlSafe(
114 * IN PMDL Mdl,
115 * IN MM_PAGE_PRIORITY Priority)
116 */
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)))
123
124 /*
125 * VOID
126 * MmInitializeMdl(
127 * IN PMDL MemoryDescriptorList,
128 * IN PVOID BaseVa,
129 * IN SIZE_T Length)
130 */
131 #define MmInitializeMdl(_MemoryDescriptorList, \
132 _BaseVa, \
133 _Length) \
134 { \
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; \
142 }
143
144 /*
145 * VOID
146 * MmPrepareMdlForReuse(
147 * IN PMDL Mdl)
148 */
149 #define MmPrepareMdlForReuse(_Mdl) \
150 { \
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); \
156 } \
157 }
158
159 #if (NTDDI_VERSION >= NTDDI_WIN2K)
160
161 NTKERNELAPI
162 PVOID
163 NTAPI
164 MmAllocateContiguousMemory(
165 IN SIZE_T NumberOfBytes,
166 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
167
168 NTKERNELAPI
169 PVOID
170 NTAPI
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);
177
178 NTKERNELAPI
179 PMDL
180 NTAPI
181 MmAllocatePagesForMdl(
182 IN PHYSICAL_ADDRESS LowAddress,
183 IN PHYSICAL_ADDRESS HighAddress,
184 IN PHYSICAL_ADDRESS SkipBytes,
185 IN SIZE_T TotalBytes);
186
187 NTKERNELAPI
188 VOID
189 NTAPI
190 MmBuildMdlForNonPagedPool(
191 IN OUT PMDLX MemoryDescriptorList);
192
193 //DECLSPEC_DEPRECATED_DDK
194 NTKERNELAPI
195 PMDL
196 NTAPI
197 MmCreateMdl(
198 IN PMDL MemoryDescriptorList OPTIONAL,
199 IN PVOID Base,
200 IN SIZE_T Length);
201
202 NTKERNELAPI
203 VOID
204 NTAPI
205 MmFreeContiguousMemory(
206 IN PVOID BaseAddress);
207
208 NTKERNELAPI
209 VOID
210 NTAPI
211 MmFreeContiguousMemorySpecifyCache(
212 IN PVOID BaseAddress,
213 IN SIZE_T NumberOfBytes,
214 IN MEMORY_CACHING_TYPE CacheType);
215
216 NTKERNELAPI
217 VOID
218 NTAPI
219 MmFreePagesFromMdl(
220 IN PMDLX MemoryDescriptorList);
221
222 NTKERNELAPI
223 PVOID
224 NTAPI
225 MmGetSystemRoutineAddress(
226 IN PUNICODE_STRING SystemRoutineName);
227
228 NTKERNELAPI
229 LOGICAL
230 NTAPI
231 MmIsDriverVerifying(
232 IN struct _DRIVER_OBJECT *DriverObject);
233
234 NTKERNELAPI
235 PVOID
236 NTAPI
237 MmLockPagableDataSection(
238 IN PVOID AddressWithinSection);
239
240 NTKERNELAPI
241 PVOID
242 NTAPI
243 MmMapIoSpace(
244 IN PHYSICAL_ADDRESS PhysicalAddress,
245 IN SIZE_T NumberOfBytes,
246 IN MEMORY_CACHING_TYPE CacheEnable);
247
248 NTKERNELAPI
249 PVOID
250 NTAPI
251 MmMapLockedPages(
252 IN PMDL MemoryDescriptorList,
253 IN KPROCESSOR_MODE AccessMode);
254
255 NTKERNELAPI
256 PVOID
257 NTAPI
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);
265
266 NTKERNELAPI
267 PVOID
268 NTAPI
269 MmPageEntireDriver(
270 IN PVOID AddressWithinSection);
271
272 NTKERNELAPI
273 VOID
274 NTAPI
275 MmProbeAndLockPages(
276 IN OUT PMDL MemoryDescriptorList,
277 IN KPROCESSOR_MODE AccessMode,
278 IN LOCK_OPERATION Operation);
279
280 NTKERNELAPI
281 MM_SYSTEMSIZE
282 NTAPI
283 MmQuerySystemSize(
284 VOID);
285
286 NTKERNELAPI
287 VOID
288 NTAPI
289 MmResetDriverPaging(
290 IN PVOID AddressWithinSection);
291
292 NTKERNELAPI
293 SIZE_T
294 NTAPI
295 MmSizeOfMdl(
296 IN PVOID Base,
297 IN SIZE_T Length);
298
299 NTKERNELAPI
300 VOID
301 NTAPI
302 MmUnlockPagableImageSection(
303 IN PVOID ImageSectionHandle);
304
305 NTKERNELAPI
306 VOID
307 NTAPI
308 MmUnlockPages(
309 IN OUT PMDL MemoryDescriptorList);
310
311 NTKERNELAPI
312 VOID
313 NTAPI
314 MmUnmapIoSpace(
315 IN PVOID BaseAddress,
316 IN SIZE_T NumberOfBytes);
317
318 NTKERNELAPI
319 VOID
320 NTAPI
321 MmProbeAndLockProcessPages(
322 IN OUT PMDL MemoryDescriptorList,
323 IN PEPROCESS Process,
324 IN KPROCESSOR_MODE AccessMode,
325 IN LOCK_OPERATION Operation);
326
327 NTKERNELAPI
328 VOID
329 NTAPI
330 MmUnmapLockedPages(
331 IN PVOID BaseAddress,
332 IN PMDL MemoryDescriptorList);
333
334 #endif
335
336 #if (NTDDI_VERSION >= NTDDI_WINXP)
337
338 NTKERNELAPI
339 NTSTATUS
340 NTAPI
341 MmAdvanceMdl(
342 IN OUT PMDL Mdl,
343 IN ULONG NumberOfBytes);
344
345 NTKERNELAPI
346 PVOID
347 NTAPI
348 MmAllocateMappingAddress(
349 IN SIZE_T NumberOfBytes,
350 IN ULONG PoolTag);
351
352 NTKERNELAPI
353 VOID
354 NTAPI
355 MmFreeMappingAddress(
356 IN PVOID BaseAddress,
357 IN ULONG PoolTag);
358
359 NTKERNELAPI
360 NTSTATUS
361 NTAPI
362 MmIsVerifierEnabled(
363 OUT PULONG VerifierFlags);
364
365 NTKERNELAPI
366 PVOID
367 NTAPI
368 MmMapLockedPagesWithReservedMapping(
369 IN PVOID MappingAddress,
370 IN ULONG PoolTag,
371 IN PMDL MemoryDescriptorList,
372 IN MEMORY_CACHING_TYPE CacheType);
373
374 NTKERNELAPI
375 NTSTATUS
376 NTAPI
377 MmProtectMdlSystemAddress(
378 IN PMDL MemoryDescriptorList,
379 IN ULONG NewProtect);
380
381 NTKERNELAPI
382 VOID
383 NTAPI
384 MmUnmapReservedMapping(
385 IN PVOID BaseAddress,
386 IN ULONG PoolTag,
387 IN PMDL MemoryDescriptorList);
388
389 #endif
390
391 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
392 NTKERNELAPI
393 PMDL
394 NTAPI
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,
401 IN ULONG Flags);
402 #endif
403