0

我在理解 WDK 中的 PHYSICAL_ADDRESS 结构时遇到了一些问题。我认为它是物理内存中的真实物理地址。现在我已经尝试过了——我的驱动程序中有 512 MB RAM 和代码的虚拟 PC

PHYSICAL_ADDRESS pa;
pa.QuadPart = 9223372036854775805; //max LONGLONG - 1
mr = MmMapIoSpace(pa , 100, 0);
DbgPrint("%i ", MmGetPhysicalAddress(mr));

...并且它没有问题地工作。512 MB RAM 这怎么可能?最大物理地址不是 512 MB = cca 512 000 000 吗?什么真正意味着 PHYSICAL_ADDRESS 值?

PS:请不要问我为什么要这样做。我只是想知道这怎么可能。

4

1 回答 1

0

代码正常工作意味着您成功地将(可能是伪造的)物理地址映射到您的代码可以读写的虚拟地址。这只是页表中的一个条目。显然系统不验证物理地址范围。尝试取消对获得的虚拟地址的引用: DbgPrint("%x\n", *((PULONG)mr));

于 2012-05-17T18:17:34.983 回答