我是一个全新的Windows驱动程序,因此代码中可能会出现明显的错误。
我的代码分配了很多用户空间dma缓冲区,工作正常 在这种情况下分配缓冲区(不一定是大缓冲区) MmMapLockedPagesSpecifyCache抛出异常。 失败的代码阶段如下: 1.使用MmMapIoSpace将物理地址映射到内核模式虚拟地址, 驱动程序可以访问此虚拟地址,但在用户模式下无法访问。 2.使用IoAllocateMdl和MmBuildMdlForNonPagedPool为其构建MDL 映射的物理地址。 3.使用MmMapLockedPagesSpecifyCache映射MDL描述的物理页面 到用户模式的虚拟地址。
因为我们的驱动程序将始终是最顶层的驱动程序,并在上下文中运行 在当前进程中,此用户模式虚拟地址对调用者有效。
代码段:
phy_buf->kernel_addr = MmMapIoSpace(phy_buf->phy_addr, phy_buf->size, MmNonCached);
phy_buf->user_mdl = IoAllocateMdl(
phy_buf->kernel_addr,
phy_buf->size,
FALSE,
FALSE,
NULL);
if(phy_buf->user_mdl)
{
MmBuildMdlForNonPagedPool(phy_buf->user_mdl);
__try{
phy_buf->user_addr = MmMapLockedPagesSpecifyCache(
phy_buf->user_mdl,
UserMode,
MmNonCached,
NULL,
FALSE,
NormalPagePriority) ;
}__except(EXCEPTION_EXECUTE_HANDLER) {
IoFreeMdl(phy_buf->user_mdl);
phy_buf->user_mdl = NULL;
DbgMessage(FATAL, "MmMapLockedPagesSpecifyCache failed on EXCEPTION_EXECUTE_HANDLER\n");
return NULL;
}
if (phy_buf->user_addr == NULL)
{
IoFreeMdl(phy_buf->user_mdl);
phy_buf->user_mdl = NULL;
DbgMessage(FATAL, "MmMapLockedPagesSpecifyCache failed\n");
}
另外,我如何获得(或打印)引发的确切异常。