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) 325 KPROCESSOR_MODE AccessMode, 326 _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType, 327 _In_opt_ PVOID BaseAddress, 328 _In_ ULONG BugCheckOnFailure, 329 _In_ MM_PAGE_PRIORITY Priority); 330 331 _IRQL_requires_max_(APC_LEVEL) 332 NTKERNELAPI 333 PVOID 334 NTAPI 335 MmPageEntireDriver( 336 _In_ PVOID AddressWithinSection); 337 338 _IRQL_requires_max_(DISPATCH_LEVEL) 339 _At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset, 340 _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount)) 341 NTKERNELAPI 342 VOID 343 NTAPI 344 MmProbeAndLockPages( 345 _Inout_ PMDL MemoryDescriptorList, 346 _In_ KPROCESSOR_MODE AccessMode, 347 _In_ LOCK_OPERATION Operation); 348 349 NTKERNELAPI 350 MM_SYSTEMSIZE 351 NTAPI 352 MmQuerySystemSize(VOID); 353 354 _IRQL_requires_max_(APC_LEVEL) 355 NTKERNELAPI 356 VOID 357 NTAPI 358 MmResetDriverPaging( 359 _In_ PVOID AddressWithinSection); 360 361 NTKERNELAPI 362 SIZE_T 363 NTAPI 364 MmSizeOfMdl( 365 _In_reads_bytes_opt_ (Length) PVOID Base, 366 _In_ SIZE_T Length); 367 368 _IRQL_requires_max_(DISPATCH_LEVEL) 369 NTKERNELAPI 370 VOID 371 NTAPI 372 MmUnlockPagableImageSection( 373 _In_ PVOID ImageSectionHandle); 374 375 _IRQL_requires_max_(DISPATCH_LEVEL) 376 NTKERNELAPI 377 VOID 378 NTAPI 379 MmUnlockPages( 380 _Inout_ PMDL MemoryDescriptorList); 381 382 _IRQL_requires_max_(DISPATCH_LEVEL) 383 NTKERNELAPI 384 VOID 385 NTAPI 386 MmUnmapIoSpace( 387 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, 388 _In_ SIZE_T NumberOfBytes); 389 390 _IRQL_requires_max_ (APC_LEVEL) 391 NTKERNELAPI 392 VOID 393 NTAPI 394 MmProbeAndLockProcessPages( 395 _Inout_ PMDL MemoryDescriptorList, 396 _In_ PEPROCESS Process, 397 _In_ KPROCESSOR_MODE AccessMode, 398 _In_ LOCK_OPERATION Operation); 399 400 _IRQL_requires_max_(DISPATCH_LEVEL) 401 NTKERNELAPI 402 VOID 403 NTAPI 404 MmUnmapLockedPages( 405 _In_ PVOID BaseAddress, 406 _Inout_ PMDL MemoryDescriptorList); 407 408 _Must_inspect_result_ 409 _IRQL_requires_max_(DISPATCH_LEVEL) 410 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 411 NTKERNELAPI 412 PVOID 413 NTAPI 414 MmAllocateContiguousMemorySpecifyCacheNode( 415 _In_ SIZE_T NumberOfBytes, 416 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, 417 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, 418 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, 419 _In_ MEMORY_CACHING_TYPE CacheType, 420 _In_ NODE_REQUIREMENT PreferredNode); 421 $endif (_WDMDDK_) 422 $if (_NTDDK_) 423 424 _IRQL_requires_max_ (PASSIVE_LEVEL) 425 NTKERNELAPI 426 PPHYSICAL_MEMORY_RANGE 427 NTAPI 428 MmGetPhysicalMemoryRanges(VOID); 429 430 NTKERNELAPI 431 PHYSICAL_ADDRESS 432 NTAPI 433 MmGetPhysicalAddress( 434 _In_ PVOID BaseAddress); 435 436 NTKERNELAPI 437 BOOLEAN 438 NTAPI 439 MmIsNonPagedSystemAddressValid( 440 _In_ PVOID VirtualAddress); 441 442 _Must_inspect_result_ 443 _IRQL_requires_max_(APC_LEVEL) 444 _Out_writes_bytes_opt_(NumberOfBytes) 445 NTKERNELAPI 446 PVOID 447 NTAPI 448 MmAllocateNonCachedMemory( 449 _In_ SIZE_T NumberOfBytes); 450 451 _IRQL_requires_max_(APC_LEVEL) 452 NTKERNELAPI 453 VOID 454 NTAPI 455 MmFreeNonCachedMemory( 456 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 457 _In_ SIZE_T NumberOfBytes); 458 459 NTKERNELAPI 460 PVOID 461 NTAPI 462 MmGetVirtualForPhysical( 463 _In_ PHYSICAL_ADDRESS PhysicalAddress); 464 465 _Must_inspect_result_ 466 _IRQL_requires_max_(APC_LEVEL) 467 NTKERNELAPI 468 NTSTATUS 469 NTAPI 470 MmMapUserAddressesToPage( 471 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 472 _In_ SIZE_T NumberOfBytes, 473 _In_ PVOID PageAddress); 474 475 _Must_inspect_result_ 476 _IRQL_requires_max_(APC_LEVEL) 477 _Out_writes_bytes_opt_(NumberOfBytes) 478 NTKERNELAPI 479 PVOID 480 NTAPI 481 MmMapVideoDisplay( 482 _In_ PHYSICAL_ADDRESS PhysicalAddress, 483 _In_ SIZE_T NumberOfBytes, 484 _In_ MEMORY_CACHING_TYPE CacheType); 485 486 _Must_inspect_result_ 487 _IRQL_requires_max_(APC_LEVEL) 488 NTKERNELAPI 489 NTSTATUS 490 NTAPI 491 MmMapViewInSessionSpace( 492 _In_ PVOID Section, 493 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, 494 _Inout_ PSIZE_T ViewSize); 495 496 _Must_inspect_result_ 497 _IRQL_requires_max_(APC_LEVEL) 498 NTKERNELAPI 499 NTSTATUS 500 NTAPI 501 MmMapViewInSystemSpace( 502 _In_ PVOID Section, 503 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, 504 _Inout_ PSIZE_T ViewSize); 505 506 _IRQL_requires_max_(DISPATCH_LEVEL) 507 NTKERNELAPI 508 BOOLEAN 509 NTAPI 510 MmIsAddressValid( 511 _In_ PVOID VirtualAddress); 512 513 NTKERNELAPI 514 BOOLEAN 515 NTAPI 516 MmIsThisAnNtAsSystem(VOID); 517 518 _IRQL_requires_max_(APC_LEVEL) 519 NTKERNELAPI 520 VOID 521 NTAPI 522 MmLockPagableSectionByHandle( 523 _In_ PVOID ImageSectionHandle); 524 525 _IRQL_requires_max_(APC_LEVEL) 526 NTKERNELAPI 527 NTSTATUS 528 NTAPI 529 MmUnmapViewInSessionSpace( 530 _In_ PVOID MappedBase); 531 532 _IRQL_requires_max_(APC_LEVEL) 533 NTKERNELAPI 534 NTSTATUS 535 NTAPI 536 MmUnmapViewInSystemSpace( 537 _In_ PVOID MappedBase); 538 539 _IRQL_requires_max_(APC_LEVEL) 540 NTKERNELAPI 541 VOID 542 NTAPI 543 MmUnsecureVirtualMemory( 544 _In_ HANDLE SecureHandle); 545 546 _IRQL_requires_max_ (PASSIVE_LEVEL) 547 NTKERNELAPI 548 NTSTATUS 549 NTAPI 550 MmRemovePhysicalMemory( 551 _In_ PPHYSICAL_ADDRESS StartAddress, 552 _Inout_ PLARGE_INTEGER NumberOfBytes); 553 554 _Must_inspect_result_ 555 _IRQL_requires_max_(APC_LEVEL) 556 NTKERNELAPI 557 HANDLE 558 NTAPI 559 MmSecureVirtualMemory( 560 __in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address, 561 _In_ __in_data_source(USER_MODE) SIZE_T Size, 562 _In_ ULONG ProbeMode); 563 564 _IRQL_requires_max_(APC_LEVEL) 565 NTKERNELAPI 566 VOID 567 NTAPI 568 MmUnmapVideoDisplay( 569 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, 570 _In_ SIZE_T NumberOfBytes); 571 572 _IRQL_requires_max_ (PASSIVE_LEVEL) 573 NTKERNELAPI 574 NTSTATUS 575 NTAPI 576 MmAddPhysicalMemory( 577 _In_ PPHYSICAL_ADDRESS StartAddress, 578 _Inout_ PLARGE_INTEGER NumberOfBytes); 579 $endif (_NTDDK_) 580 $if (_NTIFS_) 581 582 NTKERNELAPI 583 BOOLEAN 584 NTAPI 585 MmIsRecursiveIoFault(VOID); 586 587 _IRQL_requires_max_ (APC_LEVEL) 588 NTKERNELAPI 589 BOOLEAN 590 NTAPI 591 MmForceSectionClosed( 592 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 593 _In_ BOOLEAN DelayClose); 594 595 _IRQL_requires_max_ (APC_LEVEL) 596 NTKERNELAPI 597 BOOLEAN 598 NTAPI 599 MmFlushImageSection( 600 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 601 _In_ MMFLUSH_TYPE FlushType); 602 603 _IRQL_requires_max_ (APC_LEVEL) 604 NTKERNELAPI 605 BOOLEAN 606 NTAPI 607 MmCanFileBeTruncated( 608 _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, 609 _In_opt_ PLARGE_INTEGER NewFileSize); 610 611 _IRQL_requires_max_ (APC_LEVEL) 612 NTKERNELAPI 613 BOOLEAN 614 NTAPI 615 MmSetAddressRangeModified( 616 _In_reads_bytes_ (Length) PVOID Address, 617 _In_ SIZE_T Length); 618 $endif (_NTIFS_) 619 620 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ 621 622 $if (_WDMDDK_ || _NTIFS_) 623 #if (NTDDI_VERSION >= NTDDI_WINXP) 624 $endif (_WDMDDK_ || _NTIFS_) 625 626 $if (_WDMDDK_) 627 _IRQL_requires_max_(DISPATCH_LEVEL) 628 NTKERNELAPI 629 NTSTATUS 630 NTAPI 631 MmAdvanceMdl( 632 _Inout_ PMDL Mdl, 633 _In_ ULONG NumberOfBytes); 634 635 _Must_inspect_result_ 636 _IRQL_requires_max_(APC_LEVEL) 637 _When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes)) 638 NTKERNELAPI 639 PVOID 640 NTAPI 641 MmAllocateMappingAddress( 642 _In_ SIZE_T NumberOfBytes, 643 _In_ ULONG PoolTag); 644 645 _IRQL_requires_max_(APC_LEVEL) 646 NTKERNELAPI 647 VOID 648 NTAPI 649 MmFreeMappingAddress( 650 _In_ PVOID BaseAddress, 651 _In_ ULONG PoolTag); 652 653 _IRQL_requires_max_ (APC_LEVEL) 654 NTKERNELAPI 655 NTSTATUS 656 NTAPI 657 MmIsVerifierEnabled( 658 _Out_ PULONG VerifierFlags); 659 660 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount) 661 _IRQL_requires_max_(DISPATCH_LEVEL) 662 _At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset, 663 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) 664 _Must_inspect_result_ 665 _Success_(return != NULL) 666 NTKERNELAPI 667 PVOID 668 NTAPI 669 MmMapLockedPagesWithReservedMapping( 670 _In_ PVOID MappingAddress, 671 _In_ ULONG PoolTag, 672 _Inout_ PMDL MemoryDescriptorList, 673 _In_ __drv_strictTypeMatch(__drv_typeCond) 674 MEMORY_CACHING_TYPE CacheType); 675 676 _Must_inspect_result_ 677 _IRQL_requires_max_(DISPATCH_LEVEL) 678 NTKERNELAPI 679 NTSTATUS 680 NTAPI 681 MmProtectMdlSystemAddress( 682 _In_ PMDL MemoryDescriptorList, 683 _In_ ULONG NewProtect); 684 685 _IRQL_requires_max_(DISPATCH_LEVEL) 686 NTKERNELAPI 687 VOID 688 NTAPI 689 MmUnmapReservedMapping( 690 _In_ PVOID BaseAddress, 691 _In_ ULONG PoolTag, 692 _Inout_ PMDL MemoryDescriptorList); 693 694 _IRQL_requires_max_ (APC_LEVEL) 695 NTKERNELAPI 696 NTSTATUS 697 NTAPI 698 MmAddVerifierThunks( 699 _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer, 700 _In_ ULONG ThunkBufferSize); 701 $endif (_WDMDDK_) 702 $if (_NTIFS_) 703 704 _IRQL_requires_max_ (PASSIVE_LEVEL) 705 NTKERNELAPI 706 NTSTATUS 707 NTAPI 708 MmPrefetchPages( 709 _In_ ULONG NumberOfLists, 710 _In_reads_ (NumberOfLists) PREAD_LIST *ReadLists); 711 $endif (_NTIFS_) 712 713 $if (_WDMDDK_ || _NTIFS_) 714 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ 715 $endif (_WDMDDK_ || _NTIFS_) 716 $if (_WDMDDK_ || _NTDDK_) 717 #if (NTDDI_VERSION >= NTDDI_WS03) 718 $endif (_WDMDDK_ || _NTDDK_) 719 $if (_WDMDDK_) 720 _IRQL_requires_max_ (DISPATCH_LEVEL) 721 NTKERNELAPI 722 LOGICAL 723 NTAPI 724 MmIsIoSpaceActive( 725 _In_ PHYSICAL_ADDRESS StartAddress, 726 _In_ SIZE_T NumberOfBytes); 727 $endif (_WDMDDK_) 728 729 $if (_NTDDK_) 730 _Must_inspect_result_ 731 _IRQL_requires_max_(PASSIVE_LEVEL) 732 NTKERNELAPI 733 NTSTATUS 734 NTAPI 735 MmCreateMirror(VOID); 736 $endif (_NTDDK_) 737 $if (_WDMDDK_ || _NTDDK_) 738 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ 739 $endif (_WDMDDK_ || _NTDDK_) 740 $if (_WDMDDK_) 741 #if (NTDDI_VERSION >= NTDDI_WS03SP1) 742 _Must_inspect_result_ 743 _IRQL_requires_max_ (DISPATCH_LEVEL) 744 NTKERNELAPI 745 PMDL 746 NTAPI 747 MmAllocatePagesForMdlEx( 748 _In_ PHYSICAL_ADDRESS LowAddress, 749 _In_ PHYSICAL_ADDRESS HighAddress, 750 _In_ PHYSICAL_ADDRESS SkipBytes, 751 _In_ SIZE_T TotalBytes, 752 _In_ MEMORY_CACHING_TYPE CacheType, 753 _In_ ULONG Flags); 754 #endif 755 $endif (_WDMDDK_) 756 757 #if (NTDDI_VERSION >= NTDDI_VISTA) 758 $if (_WDMDDK_) 759 _IRQL_requires_max_ (APC_LEVEL) 760 NTKERNELAPI 761 LOGICAL 762 NTAPI 763 MmIsDriverVerifyingByAddress( 764 _In_ PVOID AddressWithinSection); 765 $endif (_WDMDDK_) 766 $if (_NTDDK_) 767 _Must_inspect_result_ 768 _IRQL_requires_max_(APC_LEVEL) 769 NTSTATUS 770 NTAPI 771 MmRotatePhysicalView( 772 _In_ PVOID VirtualAddress, 773 _Inout_ PSIZE_T NumberOfBytes, 774 _In_opt_ PMDLX NewMdl, 775 _In_ MM_ROTATE_DIRECTION Direction, 776 _In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, 777 _In_opt_ PVOID Context); 778 $endif (_NTDDK_) 779 $if (_NTIFS_) 780 781 _IRQL_requires_max_ (APC_LEVEL) 782 NTKERNELAPI 783 ULONG 784 NTAPI 785 MmDoesFileHaveUserWritableReferences( 786 _In_ PSECTION_OBJECT_POINTERS SectionPointer); 787 788 _Must_inspect_result_ 789 _At_(*BaseAddress, __drv_allocatesMem(Mem)) 790 __kernel_entry 791 NTSYSCALLAPI 792 NTSTATUS 793 NTAPI 794 NtAllocateVirtualMemory( 795 _In_ HANDLE ProcessHandle, 796 _Inout_ _Outptr_result_buffer_(*RegionSize) PVOID *BaseAddress, 797 _In_ ULONG_PTR ZeroBits, 798 _Inout_ PSIZE_T RegionSize, 799 _In_ ULONG AllocationType, 800 _In_ ULONG Protect); 801 802 __kernel_entry 803 _IRQL_requires_max_(PASSIVE_LEVEL) 804 NTSYSCALLAPI 805 NTSTATUS 806 NTAPI 807 NtFreeVirtualMemory( 808 _In_ HANDLE ProcessHandle, 809 _Inout_ __drv_freesMem(Mem) PVOID *BaseAddress, 810 _Inout_ PSIZE_T RegionSize, 811 _In_ ULONG FreeType); 812 813 $endif (_NTIFS_) 814 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 815 816