首页 文章

如何在WinCe7中的用户模式应用程序中访问内核模式内存

提问于
浏览
0

我为Win CE 7编写了直接显示过滤器和视频解码器驱动程序 . 过滤器在用户模式下加载,解码器驱动程序在内核模式下加载 . 过滤器需要内存来接收输入缓冲区,并通过调用视频解码器驱动程序函数来分配此内存 . 解码器驱动程序分配内存并从内核空间(> 2GB)返回其虚拟地址,因为它是在内核模式下加载的 . 但是过滤器无法访问此内存,因为它是在用户模式下加载的 .

通过考虑上述场景,如何使视频解码器驱动程序分配的内存可用于过滤器?

1 回答

  • 2

    我不确定这是否有助于您考虑使用Win CE 7,但在Windows 7中,我有一个驱动程序将内核模式地址映射到用户模式地址,然后将生成的用户模式地址返回给我的应用程序 .

    void *userSpaceAddr;
    
    // Allocate the MDL describing our kernel memory
    pmdl = IoAllocateMdl((PVOID)&my_heap_var,
                         (ULONG)size_of_my_heap_var,
                         FALSE,
                         FALSE,
                         NULL);
    if(!pmdl) {
        DbgPrintEx(DPFLTR_IHVVIDEO_ID, DPFLTR_INFO_LEVEL, "Error on IoAllocateMdl. Returning from driver early.\n");
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    
    MmBuildMdlForNonPagedPool(pmdl);
    
    userSpaceAddr = (void *)MmMapLockedPagesSpecifyCache(pmdl, UserMode, MmWriteCombined, NULL, FALSE, LowPagePriority);
    

    userSpaceAddr 映射到调用驱动程序的进程上下文中的用户空间虚拟地址 . 然后,您可以将userSpaceAddr返回给您的应用程序 .

    这取决于MmMapLockedPagesSpecifyCache函数 . MSDN doc这里:http://msdn.microsoft.com/en-us/library/windows/hardware/ff554629(v=vs.85).aspx

相关问题