【问题标题】:How to access kernel mode memory in user mode application in WinCe7WinCe7用户态应用程序如何访问内核态内存
【发布时间】:2013-07-29 04:39:03
【问题描述】:

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

考虑到上述情况,如何让视频解码器驱动分配的内存可供过滤器访问?

【问题讨论】:

  • 好吧,你能不能不分配用户空间的缓冲区,把它们传给视频解码器驱动来填满?
  • 基本上,视频解码器驱动程序需要一个来自过滤器的缓冲区,其中包含编码数据。视频解码器驱动程序获取此缓冲区,解码数据并将其发送回过滤器。

标签: windows embedded kernel windows-ce device-driver


【解决方案1】:

我不确定这是否有助于考虑您使用的是 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 文档在这里:http://msdn.microsoft.com/en-us/library/windows/hardware/ff554629(v=vs.85).aspx

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2012-05-17
    • 1970-01-01
    • 2016-06-10
    • 2011-07-10
    • 2018-06-30
    • 2015-07-08
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多