带有MmMapIoSpace的幻数

所以在用MmMapIoSpace映射一个内存空间时,我注意到过去的某个时候,写入的数据只是被丢弃了。 没有错误,断点甚至错误检查。 一切正常,没有任何不利影响。

我决定做一个写/读testing(驱动程序将1写入每个字节的长度的预期大小)和读者(userland)模式将读取和报告1的结束。

它的数字是3208,这是一个看起来不错的整数(/ 8 = 401,/ 256 = 12等)

这是怎么回事? 为什么我不能映射整个缓冲区空间?

编辑并在64位下降到2492。

我不是专家,但是我不明白MmMapIoSpace如何依赖于你所要求的,因为不能保证用户空间缓冲区在物理内存中是连续的。

相反,我想你应该使用IoAllocateMdlMmProbeAndLockPages来锁定用户缓冲区,然后使用MmGetSystemAddressForMdlSafe将其映射到系统地址空间。 这个过程在这里描述 。

如前所述,我认为映射失败的地方(3208/2492字节到缓冲区)可能只是页面的结尾,但是这很容易让你验证:让用户空间应用程序报告没有被写入的第一个字节的(虚拟)地址而不是偏移量,并检查它是否是4096的倍数。