列表4-19. 获取idt门的值
ioctl函数spy_io_physical
spy_io_physical函数很简单,它完全依赖于ntoskrnl.exe导出的mmgetphysicaladdress()函数。该ioctl函数通过简单的调用spyinputpointer()(参见列表4-10)来获取需要转换的线性地址,然后让mmgetphysicaladdress()查找对应的物理地址,最后将结果作为physical_address结构返回给调用者。注意,physical_address是一个64位的large_integer。在大多数i386系统上,其高32位总是为0。不过,若系统启用了物理地址扩展(physical address extension, pae),并且安装的内存大于4gb,这些位可能就是非0值了。
mmgetphysicaladdress()使用起始于线性地址0xc0000000的pte数组,来进行物理地址的查找。其基本的工作机制如下: