MCPcopy Create free account
hub / github.com/HoShiMin/Kernel-Bridge / MapMdl

Function MapMdl

Kernel-Bridge/API/MemoryUtils.cpp:481–543  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

479
480 _IRQL_requires_max_(APC_LEVEL)
481 NTSTATUS MapMdl(
482 IN PMDL Mdl,
483 OUT PVOID* MappedMemory,
484 OPTIONAL PEPROCESS SrcProcess,
485 OPTIONAL PEPROCESS DestProcess,
486 BOOLEAN NeedProbeAndLock,
487 KPROCESSOR_MODE MapToAddressSpace,
488 ULONG Protect,
489 MEMORY_CACHING_TYPE CacheType,
490 OPTIONAL PVOID UserRequestedAddress
491 ) {
492 if (!MappedMemory) return STATUS_INVALID_PARAMETER;
493 *MappedMemory = NULL;
494
495 if (UserRequestedAddress) {
496 if (
497 (MapToAddressSpace == KernelMode && AddressRange::IsUserAddress(UserRequestedAddress)) ||
498 (MapToAddressSpace == UserMode && AddressRange::IsKernelAddress(UserRequestedAddress))
499 ) return STATUS_INVALID_PARAMETER_6; // Access mode is incompatible with UserRequestAddress!
500 }
501
502 BOOLEAN IsLocked = FALSE;
503 BOOLEAN IsAttached = FALSE;
504 KAPC_STATE ApcState;
505 __try {
506 PEPROCESS CurrentProcess = PsGetCurrentProcess();
507
508 // Lock and prepare pages in target process:
509 if (NeedProbeAndLock) {
510 if (!SrcProcess || SrcProcess == CurrentProcess)
511 MmProbeAndLockPages(Mdl, KernelMode, IoReadAccess);
512 else
513 MmProbeAndLockProcessPages(Mdl, SrcProcess, KernelMode, IoReadAccess);
514 IsLocked = TRUE;
515 }
516
517 if (DestProcess && DestProcess != CurrentProcess) {
518 KeStackAttachProcess(DestProcess, &ApcState);
519 IsAttached = TRUE;
520 }
521
522 // Map prepared pages to current process:
523 PVOID Mapping = MmMapLockedPagesSpecifyCache(
524 Mdl,
525 MapToAddressSpace,
526 CacheType,
527 MapToAddressSpace == UserMode ? UserRequestedAddress : NULL,
528 FALSE,
529 NormalPagePriority
530 );
531
532 MmProtectMdlSystemAddress(Mdl, Protect);
533
534 if (IsAttached) KeUnstackDetachProcess(&ApcState);
535 *MappedMemory = Mapping;
536 } __except (EXCEPTION_EXECUTE_HANDLER) {
537 if (IsAttached) KeUnstackDetachProcess(&ApcState);
538 if (IsLocked) MmUnlockPages(Mdl);

Callers 2

MapMemoryFunction · 0.85
KbMapMdlFunction · 0.85

Calls 2

IsUserAddressFunction · 0.70
IsKernelAddressFunction · 0.70

Tested by

no test coverage detected