我为Win CE 7编写了直接显示过滤器和视频解码器驱动程序。过滤器以用户模式加载,解码器驱动程序以内核模式加载。过滤器需要内存来接收输入缓冲区,并通过调用视频解码器驱动程序函数来分配此内存。解码器驱动程序分配内存并从内核空间(> 2GB)返回其虚拟地址,因为它是在内核模式下加载的。但是过滤器无法访问此内存,因为它是在用户模式下加载的。
通过考虑上述情况,如何使视频解码器驱动程序分配的内存可用于过滤器?
答案 0 :(得分: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