NTSTATUS NTAPI MmCreateVirtualMappingUnsafe( PEPROCESS Process, PVOID Address, ULONG PageProtection, PPFN_NUMBER Pages, ULONG PageCount) { ULONG i; MMPTE TmplPte, *Pte; ASSERT((ULONG_PTR)Address % PAGE_SIZE == 0); /* Check if the range is valid */ if ((Process == NULL && Address < MmSystemRangeStart) || (Process != NULL && Address > MmHighestUserAddress)) { DPRINT1("Address 0x%p is invalid for process %p\n", Address, Process); ASSERT(FALSE); } TmplPte.u.Long = 0; TmplPte.u.Hard.Valid = 1; MiSetPteProtection(&TmplPte, PageProtection); TmplPte.u.Flush.Owner = (Address < MmHighestUserAddress) ? 1 : 0; //__debugbreak(); for (i = 0; i < PageCount; i++) { TmplPte.u.Hard.PageFrameNumber = Pages[i]; Pte = MiGetPteForProcess(Process, Address, TRUE); DPRINT("MmCreateVirtualMappingUnsafe, Address=%p, TmplPte=%p, Pte=%p\n", Address, TmplPte.u.Long, Pte); if (InterlockedExchangePte(Pte, TmplPte)) { KeInvalidateTlbEntry(Address); } if (MiIsHyperspaceAddress(Pte)) MmDeleteHyperspaceMapping((PVOID)PAGE_ROUND_DOWN(Pte)); Address = (PVOID)((ULONG64)Address + PAGE_SIZE); } return STATUS_SUCCESS; }
static ULONG_PTR KdpPhysMap(ULONG_PTR PhysAddr, LONG Len) { MMPTE TempPte; PMMPTE PointerPte; ULONG_PTR VirtAddr; TempPte.u.Long = PDE_PRESENT_BIT | PDE_W_BIT | PDE_PWT_BIT | PDE_PCD_BIT | PDE_ACCESSED_BIT | PDE_DIRTY_BIT; if ((PhysAddr & (PAGE_SIZE - 1)) + Len > PAGE_SIZE) { TempPte.u.Hard.PageFrameNumber = (PhysAddr >> PAGE_SHIFT) + 1; PointerPte = MiAddressToPte((PVOID)MI_KDBG_TMP_PAGE_1); *PointerPte = TempPte; VirtAddr = (ULONG_PTR)PointerPte << 10; KeInvalidateTlbEntry((PVOID)VirtAddr); }