原因MmMapLockedPagesSpecifyCache抛出异常

时间:2016-05-19 07:30:15

标签: c++ windows memory kernel driver

我是一个全新的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");
    }

另外,我如何获得(或打印)引发的确切异常。

0 个答案:

没有答案