虚拟地址转物理地址代码(摘自Undocument NT)

CFuncGetPhysicalAddressAndPageAttributes(
unsigned int VirtualAddress,
unsigned int *PhysicalAddress,
unsigned int *PageAttributes
)

{
unsigned int *PageTableEntry;

*PhysicalAddress = 0;
*PageAttributes = 0;

PageTableEntry = (unsigned int *)0xC0000000 + (VirtualAddress >> 0x0C);

if ((*PageTableEntry)&0x01) {
*PhysicalAddress = ((*PageTableEntry)&0xFFFFF000) + (VirtualAddress&0x00000FFF);
*PageAttributes = (*PageTableEntry)&0x00000FFF;
return TRUE;
} else {
return FALSE;
}

}

CfuncGetPhysicalAddressAndPageAttributes() 函数使用调用门在内核态执行。此函数认为进程的页表总是映射在虚地址 0xC0000000 上。该地址上是一个由 1024 个页表构成的数组,每个页表又是 1024 个页表项的数组。访问此内存区时可以把它整个看作一个连续的页表项的数组。这个大数组的第一个成员对应着虚地址范围为 0到1024,第二个则对应着 4096 到 8192,依次类推。函数通过用给定的虚地址除以 1024 来计算其在大 PTE 数组中的索引——即将虚地址右移12位。将索引值加到 PTE 数组的基地址上就得到了所要的 PTE。每个 PTE 长4个字节(32位),
高20位表示物理页地址,低12位表示页属性。只有当最低位置位时,物理地址和页属性才有效。函数检查最低位是否置位,通过合适的掩码将物理页地址和页属性分离开。最后将页内偏移加到物理页地址上就得到了给定虚地址的物理地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值