1 /****************************************************************************** 2 * Memory manager Functions * 3 ******************************************************************************/ 4 $if (_WDMDDK_) 5 /* Alignment Macros */ 6 #define ALIGN_DOWN_BY(size, align) \ 7 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1)) 8 9 #define ALIGN_UP_BY(size, align) \ 10 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align)) 11 12 #define ALIGN_DOWN_POINTER_BY(ptr, align) \ 13 ((PVOID)ALIGN_DOWN_BY(ptr, align)) 14 15 #define ALIGN_UP_POINTER_BY(ptr, align) \ 16 ((PVOID)ALIGN_UP_BY(ptr, align)) 17 18 #define ALIGN_DOWN(size, type) \ 19 ALIGN_DOWN_BY(size, sizeof(type)) 20 21 #define ALIGN_UP(size, type) \ 22 ALIGN_UP_BY(size, sizeof(type)) 23 24 #define ALIGN_DOWN_POINTER(ptr, type) \ 25 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type)) 26 27 #define ALIGN_UP_POINTER(ptr, type) \ 28 ALIGN_UP_POINTER_BY(ptr, sizeof(type)) 29 30 #ifndef FIELD_OFFSET 31 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) 32 #endif 33 34 #ifndef FIELD_SIZE 35 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) 36 #endif 37 38 #define POOL_TAGGING 1 39 40 #if DBG 41 #define IF_DEBUG if (TRUE) 42 #else 43 #define IF_DEBUG if (FALSE) 44 #endif /* DBG */ 45 46 /* ULONG 47 * BYTE_OFFSET( 48 * _In_ PVOID Va) 49 */ 50 #define BYTE_OFFSET(Va) \ 51 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) 52 53 /* ULONG 54 * BYTES_TO_PAGES( 55 * _In_ ULONG Size) 56 * 57 * Note: This needs to be like this to avoid overflows! 58 */ 59 #define BYTES_TO_PAGES(Size) \ 60 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) 61 62 /* PVOID 63 * PAGE_ALIGN( 64 * _In_ PVOID Va) 65 */ 66 #define PAGE_ALIGN(Va) \ 67 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) 68 69 /* ULONG_PTR 70 * ROUND_TO_PAGES( 71 * _In_ ULONG_PTR Size) 72 */ 73 #define ROUND_TO_PAGES(Size) \ 74 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) 75 76 /* ULONG 77 * ADDRESS_AND_SIZE_TO_SPAN_PAGES( 78 * _In_ PVOID Va, 79 * _In_ ULONG Size) 80 */ 81 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \ 82 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ 83 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) 84 85 #define COMPUTE_PAGES_SPANNED(Va, Size) \ 86 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size) 87 88 /* 89 * ULONG 90 * MmGetMdlByteCount( 91 * _In_ PMDL Mdl) 92 */ 93 #define MmGetMdlByteCount(_Mdl) \ 94 ((_Mdl)->ByteCount) 95 96 /* 97 * ULONG 98 * MmGetMdlByteOffset( 99 * IN PMDL Mdl) 100 */ 101 #define MmGetMdlByteOffset(_Mdl) \ 102 ((_Mdl)->ByteOffset) 103 104 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa) 105 106 /* 107 * PPFN_NUMBER 108 * MmGetMdlPfnArray( 109 * _In_ PMDL Mdl) 110 */ 111 #define MmGetMdlPfnArray(_Mdl) \ 112 ((PPFN_NUMBER) ((_Mdl) + 1)) 113 114 /* 115 * PVOID 116 * MmGetMdlVirtualAddress( 117 * _In_ PMDL Mdl) 118 */ 119 #define MmGetMdlVirtualAddress(_Mdl) \ 120 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) 121 122 #define MmGetProcedureAddress(Address) (Address) 123 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address) 124 125 /* PVOID MmGetSystemAddressForMdl( 126 * _In_ PMDL Mdl); 127 */ 128 #define MmGetSystemAddressForMdl(Mdl) \ 129 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ 130 MDL_SOURCE_IS_NONPAGED_POOL)) ? \ 131 ((Mdl)->MappedSystemVa) : \ 132 (MmMapLockedPages((Mdl), KernelMode))) 133 134 /* PVOID 135 * MmGetSystemAddressForMdlSafe( 136 * _In_ PMDL Mdl, 137 * _In_ MM_PAGE_PRIORITY Priority) 138 */ 139 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ 140 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ 141 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \ 142 (_Mdl)->MappedSystemVa : \ 143 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ 144 KernelMode, MmCached, NULL, FALSE, (_Priority))) 145 146 /* 147 * VOID 148 * MmInitializeMdl( 149 * _In_ PMDL MemoryDescriptorList, 150 * _In_ PVOID BaseVa, 151 * _In_ SIZE_T Length) 152 */ 153 #define MmInitializeMdl(_MemoryDescriptorList, \ 154 _BaseVa, \ 155 _Length) \ 156 { \ 157 (_MemoryDescriptorList)->Next = (PMDL) NULL; \ 158 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \ 159 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \ 160 (_MemoryDescriptorList)->MdlFlags = 0; \ 161 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \ 162 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \ 163 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \ 164 } 165 166 /* 167 * VOID 168 * MmPrepareMdlForReuse( 169 * _In_ PMDL Mdl) 170 */ 171 #define MmPrepareMdlForReuse(_Mdl) \ 172 { \ 173 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ 174 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ 175 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ 176 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ 177 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ 178 } \ 179 } 180 $endif (_WDMDDK_) 181 $if (_NTIFS_) 182 183 FORCEINLINE 184 ULONG 185 HEAP_MAKE_TAG_FLAGS( 186 _In_ ULONG TagBase, 187 _In_ ULONG Tag) 188 { 189 //__assume_bound(TagBase); // FIXME 190 return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT))); 191 } 192 $endif (_NTIFS_) 193 194 #if (NTDDI_VERSION >= NTDDI_WIN2K) 195 $if (_WDMDDK_) 196 _Must_inspect_result_ 197 _IRQL_requires_max_(DISPATCH_LEVEL) 198 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 199 NTKERNELAPI 200 PVOID 201 NTAPI 202 MmAllocateContiguousMemory( 203 _In_ SIZE_T NumberOfBytes, 204 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress); 205 206 _Must_inspect_result_ 207 _IRQL_requires_max_(DISPATCH_LEVEL) 208 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 209 NTKERNELAPI 210 PVOID 211 NTAPI 212 MmAllocateContiguousMemorySpecifyCache( 213 _In_ SIZE_T NumberOfBytes, 214 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, 215 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, 216 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, 217 _In_ MEMORY_CACHING_TYPE CacheType); 218 219 _Must_inspect_result_ 220 _IRQL_requires_max_(DISPATCH_LEVEL) 221 NTKERNELAPI 222 PMDL 223 NTAPI 224 MmAllocatePagesForMdl( 225 _In_ PHYSICAL_ADDRESS LowAddress, 226 _In_ PHYSICAL_ADDRESS HighAddress, 227 _In_ PHYSICAL_ADDRESS SkipBytes, 228 _In_ SIZE_T TotalBytes); 229 230 _IRQL_requires_max_(DISPATCH_LEVEL) 231 NTKERNELAPI 232 VOID 233 NTAPI 234 MmBuildMdlForNonPagedPool( 235 _Inout_ PMDL MemoryDescriptorList); 236 237 //DECLSPEC_DEPRECATED_DDK 238 NTKERNELAPI 239 PMDL 240 NTAPI 241 MmCreateMdl( 242 _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length))) 243 PMDL MemoryDescriptorList, 244 _In_reads_bytes_opt_ (Length) PVOID Base, 245 _In_ SIZE_T Length); 246 247 _IRQL_requires_max_(DISPATCH_LEVEL) 248 NTKERNELAPI 249 VOID 250 NTAPI 251 MmFreeContiguousMemory( 252 _In_ PVOID BaseAddress); 253 254 _IRQL_requires_max_ (DISPATCH_LEVEL) 255 NTKERNELAPI 256 VOID 257 NTAPI 258 MmFreeContiguousMemorySpecifyCache( 259 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, 260 _In_ SIZE_T NumberOfBytes, 261 _In_ MEMORY_CACHING_TYPE CacheType); 262 263 _IRQL_requires_max_(DISPATCH_LEVEL) 264 NTKERNELAPI 265 VOID 266 NTAPI 267 MmFreePagesFromMdl( 268 _Inout_ PMDL MemoryDescriptorList); 269 270 _IRQL_requires_max_(PASSIVE_LEVEL) 271 NTKERNELAPI 272 PVOID 273 NTAPI 274 MmGetSystemRoutineAddress( 275 _In_ PUNICODE_STRING SystemRoutineName); 276 277 NTKERNELAPI 278 LOGICAL 279 NTAPI 280 MmIsDriverVerifying( 281 _In_ struct _DRIVER_OBJECT *DriverObject); 282 283 _Must_inspect_result_ 284 _IRQL_requires_max_(APC_LEVEL) 285 NTKERNELAPI 286 PVOID 287 NTAPI 288 MmLockPagableDataSection( 289 _In_ PVOID AddressWithinSection); 290 291 _Must_inspect_result_ 292 _IRQL_requires_max_(DISPATCH_LEVEL) 293 _Out_writes_bytes_opt_ (NumberOfBytes) 294 NTKERNELAPI 295 PVOID 296 NTAPI 297 MmMapIoSpace( 298 _In_ PHYSICAL_ADDRESS PhysicalAddress, 299 _In_ SIZE_T NumberOfBytes, 300 _In_ MEMORY_CACHING_TYPE CacheType); 301 302 _Must_inspect_result_ 303 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL)) 304 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL)) 305 NTKERNELAPI 306 PVOID 307 NTAPI 308 MmMapLockedPages( 309 _Inout_ PMDL MemoryDescriptorList, 310 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) 311 KPROCESSOR_MODE AccessMode); 312 313 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount) 314 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL)) 315 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_) 316 _At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) 317 _Must_inspect_result_ 318 _Success_(return != NULL) 319 NTKERNELAPI 320 PVOID 321 NTAPI 322 MmMapLockedPagesSpecifyCache( 323 _Inout_ PMDL MemoryDescriptorList, 324 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE AccessMode, 325 _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType, 326 _In_opt_ PVOID RequestedAddress, 327 _In_ ULONG BugCheckOnFailure, 328 _In_ ULONG Priority); 329 330 _IRQL_requires_max_(APC_LEVEL) 331 NTKERNELAPI 332 PVOID 333 NTAPI 334 MmPageEntireDriver( 335 _In_ PVOID AddressWithinSection); 336 337 _IRQL_requires_max_(DISPATCH_LEVEL) 338 _At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset, 339 _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount)) 340 NTKERNELAPI 341 VOID 342 NTAPI 343 MmProbeAndLockPages( 344 _Inout_ PMDL MemoryDescriptorList, 345 _In_ KPROCESSOR_MODE AccessMode, 346 _In_ LOCK_OPERATION Operation); 347 348 NTKERNELAPI 349 MM_SYSTEMSIZE 350 NTAPI 351 MmQuerySystemSize(VOID); 352 353 _IRQL_requires_max_(APC_LEVEL) 354 NTKERNELAPI 355 VOID 356 NTAPI 357 MmResetDriverPaging( 358 _In_ PVOID AddressWithinSection); 359 360 NTKERNELAPI 361 SIZE_T 362 NTAPI 363 MmSizeOfMdl( 364 _In_reads_bytes_opt_ (Length) PVOID Base, 365 _In_ SIZE_T Length); 366 367 _IRQL_requires_max_(DISPATCH_LEVEL) 368 NTKERNELAPI 369 VOID 370 NTAPI 371 MmUnlockPagableImageSection( 372 _In_ PVOID ImageSectionHandle); 373 374 _IRQL_requires_max_(DISPATCH_LEVEL) 375 NTKERNELAPI 376 VOID 377 NTAPI 378 MmUnlockPages( 379 _Inout_ PMDL MemoryDescriptorList); 380 381 _IRQL_requires_max_(DISPATCH_LEVEL) 382 NTKERNELAPI 383 VOID 384 NTAPI 385 MmUnmapIoSpace( 386 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, 387 _In_ SIZE_T NumberOfBytes); 388 389 _IRQL_requires_max_ (APC_LEVEL) 390 NTKERNELAPI 391 VOID 392 NTAPI 393 MmProbeAndLockProcessPages( 394 _Inout_ PMDL MemoryDescriptorList, 395 _In_ PEPROCESS Process, 396 _In_ KPROCESSOR_MODE AccessMode, 397 _In_ LOCK_OPERATION Operation); 398 399 _IRQL_requires_max_(DISPATCH_LEVEL) 400 NTKERNELAPI 401 VOID 402 NTAPI 403 MmUnmapLockedPages( 404 _In_ PVOID BaseAddress, 405 _Inout_ PMDL MemoryDescriptorList); 406 407 _Must_inspect_result_ 408 _IRQL_requires_max_(DISPATCH_LEVEL) 409 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 410 NTKERNELAPI 411 PVOID 412 NTAPI 413 MmAllocateContiguousMemorySpecifyCacheNode( 414 _In_ SIZE_T NumberOfBytes, 415 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, 416 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, 417 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, 418 _In_ MEMORY_CACHING_TYPE CacheType, 419 _In_ NODE_REQUIREMENT PreferredNode); 420 $endif (_WDMDDK_) 421 $if (_NTDDK_) 422 423 _IRQL_requires_max_ (PASSIVE_LEVEL) 424 NTKERNELAPI 425 PPHYSICAL_MEMORY_RANGE 426 NTAPI 427 MmGetPhysicalMemoryRanges(VOID); 428 429 NTKERNELAPI 430 PHYSICAL_ADDRESS 431 NTAPI 432 MmGetPhysicalAddress( 433 _In_ PVOID BaseAddress); 434 435 NTKERNELAPI 436 BOOLEAN 437 NTAPI 438 MmIsNonPagedSystemAddressValid( 439 _In_ PVOID VirtualAddress); 440 441 _Must_inspect_result_ 442 _IRQL_requires_max_(APC_LEVEL) 443 _Out_writes_bytes_opt_(NumberOfBytes) 444 NTKERNELAPI 445 PVOID 446 NTAPI 447 MmAllocateNonCachedMemory( 448 _In_ SIZE_T NumberOfBytes); 449 450 _IRQL_requires_max_(APC_LEVEL) 451 NTKERNELAPI 452 VOID 453 NTAPI 454 MmFreeNonCachedMemory( 455 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 456 _In_ SIZE_T NumberOfBytes); 457 458 NTKERNELAPI 459 PVOID 460 NTAPI 461 MmGetVirtualForPhysical( 462 _In_ PHYSICAL_ADDRESS PhysicalAddress); 463 464 _Must_inspect_result_ 465 _IRQL_requires_max_(APC_LEVEL) 466 NTKERNELAPI 467 NTSTATUS 468 NTAPI 469 MmMapUserAddressesToPage( 470 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 471 _In_ SIZE_T NumberOfBytes, 472 _In_ PVOID PageAddress); 473 474 _Must_inspect_result_ 475 _IRQL_requires_max_(APC_LEVEL) 476 _Out_writes_bytes_opt_(NumberOfBytes) 477 NTKERNELAPI 478 PVOID 479 NTAPI 480 MmMapVideoDisplay( 481 _In_ PHYSICAL_ADDRESS PhysicalAddress, 482 _In_ SIZE_T NumberOfBytes, 483 _In_ MEMORY_CACHING_TYPE CacheType); 484 485 _Must_inspect_result_ 486 _IRQL_requires_max_(APC_LEVEL) 487 NTKERNELAPI 488 NTSTATUS 489 NTAPI 490 MmMapViewInSessionSpace( 491 _In_ PVOID Section, 492 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, 493 _Inout_ PSIZE_T ViewSize); 494 495 _Must_inspect_result_ 496 _IRQL_requires_max_(APC_LEVEL) 497 NTKERNELAPI 498 NTSTATUS 499 NTAPI 500 MmMapViewInSystemSpace( 501 _In_ PVOID Section, 502 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, 503 _Inout_ PSIZE_T ViewSize); 504 505 _IRQL_requires_max_(DISPATCH_LEVEL) 506 NTKERNELAPI 507 BOOLEAN 508 NTAPI 509 MmIsAddressValid( 510 _In_ PVOID VirtualAddress); 511 512 NTKERNELAPI 513 BOOLEAN 514 NTAPI 515 MmIsThisAnNtAsSystem(VOID); 516 517 _IRQL_requires_max_(APC_LEVEL) 518 NTKERNELAPI 519 VOID 520 NTAPI 521 MmLockPagableSectionByHandle( 522 _In_ PVOID ImageSectionHandle); 523 524 _IRQL_requires_max_(APC_LEVEL) 525 NTKERNELAPI 526 NTSTATUS 527 NTAPI 528 MmUnmapViewInSessionSpace( 529 _In_ PVOID MappedBase); 530 531 _IRQL_requires_max_(APC_LEVEL) 532 NTKERNELAPI 533 NTSTATUS 534 NTAPI 535 MmUnmapViewInSystemSpace( 536 _In_ PVOID MappedBase); 537 538 _IRQL_requires_max_(APC_LEVEL) 539 NTKERNELAPI 540 VOID 541 NTAPI 542 MmUnsecureVirtualMemory( 543 _In_ HANDLE SecureHandle); 544 545 _IRQL_requires_max_ (PASSIVE_LEVEL) 546 NTKERNELAPI 547 NTSTATUS 548 NTAPI 549 MmRemovePhysicalMemory( 550 _In_ PPHYSICAL_ADDRESS StartAddress, 551 _Inout_ PLARGE_INTEGER NumberOfBytes); 552 553 _Must_inspect_result_ 554 _IRQL_requires_max_(APC_LEVEL) 555 NTKERNELAPI 556 HANDLE 557 NTAPI 558 MmSecureVirtualMemory( 559 __in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address, 560 _In_ __in_data_source(USER_MODE) SIZE_T Size, 561 _In_ ULONG ProbeMode); 562 563 _IRQL_requires_max_(APC_LEVEL) 564 NTKERNELAPI 565 VOID 566 NTAPI 567 MmUnmapVideoDisplay( 568 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 569 _In_ SIZE_T NumberOfBytes); 570 571 _IRQL_requires_max_ (PASSIVE_LEVEL) 572 NTKERNELAPI 573 NTSTATUS 574 NTAPI 575 MmAddPhysicalMemory( 576 _In_ PPHYSICAL_ADDRESS StartAddress, 577 _Inout_ PLARGE_INTEGER NumberOfBytes); 578 $endif (_NTDDK_) 579 $if (_NTIFS_) 580 581 NTKERNELAPI 582 BOOLEAN 583 NTAPI 584 MmIsRecursiveIoFault(VOID); 585 586 _IRQL_requires_max_ (APC_LEVEL) 587 NTKERNELAPI 588 BOOLEAN 589 NTAPI 590 MmForceSectionClosed( 591 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 592 _In_ BOOLEAN DelayClose); 593 594 _IRQL_requires_max_ (APC_LEVEL) 595 NTKERNELAPI 596 BOOLEAN 597 NTAPI 598 MmFlushImageSection( 599 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 600 _In_ MMFLUSH_TYPE FlushType); 601 602 _IRQL_requires_max_ (APC_LEVEL) 603 NTKERNELAPI 604 BOOLEAN 605 NTAPI 606 MmCanFileBeTruncated( 607 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 608 _In_opt_ PLARGE_INTEGER NewFileSize); 609 610 _IRQL_requires_max_ (APC_LEVEL) 611 NTKERNELAPI 612 BOOLEAN 613 NTAPI 614 MmSetAddressRangeModified( 615 _In_reads_bytes_ (Length) PVOID Address, 616 _In_ SIZE_T Length); 617 $endif (_NTIFS_) 618 619 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ 620 621 $if (_WDMDDK_ || _NTIFS_) 622 #if (NTDDI_VERSION >= NTDDI_WINXP) 623 $endif (_WDMDDK_ || _NTIFS_) 624 625 $if (_WDMDDK_) 626 _IRQL_requires_max_(DISPATCH_LEVEL) 627 NTKERNELAPI 628 NTSTATUS 629 NTAPI 630 MmAdvanceMdl( 631 _Inout_ PMDL Mdl, 632 _In_ ULONG NumberOfBytes); 633 634 _Must_inspect_result_ 635 _IRQL_requires_max_(APC_LEVEL) 636 _When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes)) 637 NTKERNELAPI 638 PVOID 639 NTAPI 640 MmAllocateMappingAddress( 641 _In_ SIZE_T NumberOfBytes, 642 _In_ ULONG PoolTag); 643 644 _IRQL_requires_max_(APC_LEVEL) 645 NTKERNELAPI 646 VOID 647 NTAPI 648 MmFreeMappingAddress( 649 _In_ PVOID BaseAddress, 650 _In_ ULONG PoolTag); 651 652 _IRQL_requires_max_ (APC_LEVEL) 653 NTKERNELAPI 654 NTSTATUS 655 NTAPI 656 MmIsVerifierEnabled( 657 _Out_ PULONG VerifierFlags); 658 659 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount) 660 _IRQL_requires_max_(DISPATCH_LEVEL) 661 _At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset, 662 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) 663 _Must_inspect_result_ 664 _Success_(return != NULL) 665 NTKERNELAPI 666 PVOID 667 NTAPI 668 MmMapLockedPagesWithReservedMapping( 669 _In_ PVOID MappingAddress, 670 _In_ ULONG PoolTag, 671 _Inout_ PMDL MemoryDescriptorList, 672 _In_ __drv_strictTypeMatch(__drv_typeCond) 673 MEMORY_CACHING_TYPE CacheType); 674 675 _Must_inspect_result_ 676 _IRQL_requires_max_(DISPATCH_LEVEL) 677 NTKERNELAPI 678 NTSTATUS 679 NTAPI 680 MmProtectMdlSystemAddress( 681 _In_ PMDL MemoryDescriptorList, 682 _In_ ULONG NewProtect); 683 684 _IRQL_requires_max_(DISPATCH_LEVEL) 685 NTKERNELAPI 686 VOID 687 NTAPI 688 MmUnmapReservedMapping( 689 _In_ PVOID BaseAddress, 690 _In_ ULONG PoolTag, 691 _Inout_ PMDL MemoryDescriptorList); 692 693 _IRQL_requires_max_ (APC_LEVEL) 694 NTKERNELAPI 695 NTSTATUS 696 NTAPI 697 MmAddVerifierThunks( 698 _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer, 699 _In_ ULONG ThunkBufferSize); 700 $endif (_WDMDDK_) 701 $if (_NTIFS_) 702 703 _IRQL_requires_max_ (PASSIVE_LEVEL) 704 NTKERNELAPI 705 NTSTATUS 706 NTAPI 707 MmPrefetchPages( 708 _In_ ULONG NumberOfLists, 709 _In_reads_ (NumberOfLists) PREAD_LIST *ReadLists); 710 $endif (_NTIFS_) 711 712 $if (_WDMDDK_ || _NTIFS_) 713 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ 714 $endif (_WDMDDK_ || _NTIFS_) 715 $if (_WDMDDK_ || _NTDDK_) 716 #if (NTDDI_VERSION >= NTDDI_WS03) 717 $endif (_WDMDDK_ || _NTDDK_) 718 $if (_WDMDDK_) 719 _IRQL_requires_max_ (DISPATCH_LEVEL) 720 NTKERNELAPI 721 LOGICAL 722 NTAPI 723 MmIsIoSpaceActive( 724 _In_ PHYSICAL_ADDRESS StartAddress, 725 _In_ SIZE_T NumberOfBytes); 726 $endif (_WDMDDK_) 727 728 $if (_NTDDK_) 729 _Must_inspect_result_ 730 _IRQL_requires_max_(PASSIVE_LEVEL) 731 NTKERNELAPI 732 NTSTATUS 733 NTAPI 734 MmCreateMirror(VOID); 735 $endif (_NTDDK_) 736 $if (_WDMDDK_ || _NTDDK_) 737 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ 738 $endif (_WDMDDK_ || _NTDDK_) 739 $if (_WDMDDK_) 740 #if (NTDDI_VERSION >= NTDDI_WS03SP1) 741 _Must_inspect_result_ 742 _IRQL_requires_max_ (DISPATCH_LEVEL) 743 NTKERNELAPI 744 PMDL 745 NTAPI 746 MmAllocatePagesForMdlEx( 747 _In_ PHYSICAL_ADDRESS LowAddress, 748 _In_ PHYSICAL_ADDRESS HighAddress, 749 _In_ PHYSICAL_ADDRESS SkipBytes, 750 _In_ SIZE_T TotalBytes, 751 _In_ MEMORY_CACHING_TYPE CacheType, 752 _In_ ULONG Flags); 753 #endif 754 $endif (_WDMDDK_) 755 756 #if (NTDDI_VERSION >= NTDDI_VISTA) 757 $if (_WDMDDK_) 758 _IRQL_requires_max_ (APC_LEVEL) 759 NTKERNELAPI 760 LOGICAL 761 NTAPI 762 MmIsDriverVerifyingByAddress( 763 _In_ PVOID AddressWithinSection); 764 $endif (_WDMDDK_) 765 $if (_NTDDK_) 766 _Must_inspect_result_ 767 _IRQL_requires_max_(APC_LEVEL) 768 NTSTATUS 769 NTAPI 770 MmRotatePhysicalView( 771 _In_ PVOID VirtualAddress, 772 _Inout_ PSIZE_T NumberOfBytes, 773 _In_opt_ PMDLX NewMdl, 774 _In_ MM_ROTATE_DIRECTION Direction, 775 _In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, 776 _In_opt_ PVOID Context); 777 $endif (_NTDDK_) 778 $if (_NTIFS_) 779 780 _IRQL_requires_max_ (APC_LEVEL) 781 NTKERNELAPI 782 ULONG 783 NTAPI 784 MmDoesFileHaveUserWritableReferences( 785 _In_ PSECTION_OBJECT_POINTERS SectionPointer); 786 787 _Must_inspect_result_ 788 _At_(*BaseAddress, __drv_allocatesMem(Mem)) 789 __kernel_entry 790 NTSYSCALLAPI 791 NTSTATUS 792 NTAPI 793 NtAllocateVirtualMemory( 794 _In_ HANDLE ProcessHandle, 795 _Inout_ _Outptr_result_buffer_(*RegionSize) PVOID *BaseAddress, 796 _In_ ULONG_PTR ZeroBits, 797 _Inout_ PSIZE_T RegionSize, 798 _In_ ULONG AllocationType, 799 _In_ ULONG Protect); 800 801 __kernel_entry 802 _IRQL_requires_max_(PASSIVE_LEVEL) 803 NTSYSCALLAPI 804 NTSTATUS 805 NTAPI 806 NtFreeVirtualMemory( 807 _In_ HANDLE ProcessHandle, 808 _Inout_ __drv_freesMem(Mem) PVOID *BaseAddress, 809 _Inout_ PSIZE_T RegionSize, 810 _In_ ULONG FreeType); 811 812 $endif (_NTIFS_) 813 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 814 815