1.5 MmCreateMapping过程——私有页表构建初始化
NTSTATUS NTAPI MmCreateMapping (
PHYSICAL_ADDRESS PhysicalAddress,
PVOID VirtualAddress,
BOOLEAN bLargePage
)
{
PALLOCATED_PAGE Pml4Page;
NTSTATUS Status;
Status = MmFindPageByPA (g_PageMapBasePhysicalAddress, &Pml4Page);
if (!NT_SUCCESS (Status)) {
return STATUS_UNSUCCESSFUL;
}
PhysicalAddress.QuadPart = PhysicalAddress.QuadPart & 0x000ffffffffff000;
VirtualAddress = (PVOID) ((ULONG64) VirtualAddress & 0xfffffffffffff000);
return MmUpdatePageTable (Pml4Page->GuestAddress, 4, VirtualAddress, PhysicalAddress, bLargePage);
}
1.5.1 调用MmFindPageByPA ——获得PML4页表在OS中的线性地址
static NTSTATUS NTAPI MmFindPageByPA (
PHYSICAL_ADDRESS PhysicalAddress,
PALLOCATED_PAGE * pAllocatedPage
)
{
PALLOCATED_PAGE AllocatedPage;