阅读:11612回复:8
关于内存分配的一个问题?
我现在想做的是:
1.在内核模式下分配一个2M byte大小的内存缓冲区 2.需要将这个内存地址传回应用程序,在应用程序中要使用到这个内存地址 想问问各位如此实现有无问题 在内核模式下使用ExAllocatePool()函数所返回的内存地址能不能直接传回用户模式?还是需要经过内存转换后再传回? 或者各位还有什么别的办法? 小弟接触DDK不久,还望大家多多指教 |
|
沙发#
发布于:2002-03-11 16:43
不知你有否看过Chris Cant 著的《Windows WDM 设备驱动程序开发指南》(机械工业出版社出版)一书,该书的每一个驱动程序例子就讲到了关于如何在应用程序和驱程序之间\"共享缓冲区\"的方法。
但它并不是在驱动程序中分配内存然后应用程序,驱动程序中分配的NON_PAGED的内存对于应用程序来说是没有权限使用的,相反,Chris Cant采用一个折衷的办法,在应用程序中分配一个缓冲区以存放用户数据,驱动程序中分配一块内存作为交换数据使用。 Driver需要应用程序的数据时就将应用程序的数据拷到驱动程序的内存池中,反之则朝相反的方向拷贝。 |
|
|
板凳#
发布于:2002-03-11 17:23
谢谢你的提示,我正好有这本书,可惜没仔细看
用我的方法就无法实现了吗? |
|
地板#
发布于:2002-03-11 17:36
实现的话我想应该也可以实现,但在WDM中我没有试过,你可以参考一下相关的书籍。另外我记得《Win9x Vxd 编程权威指南》一书中好象有提到过这样的技术,不过它是应用于VxD.
本站有很多高手,多向他们请教, |
|
|
地下室#
发布于:2002-03-11 19:59
驱动程序中分配的内存对于应用程序也可用(无论分页或不分页),具体如下:
SystemAddress = ExAllocatePool(PoolType, Size); // 非分页池或分页池 Mdl = IoAllocateMdl(SystemAddress, Size, FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(Mdl); // 非分页池 try{MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);} // 分页池 UserAddress = MmMapLockedPages(Mdl, UserMode); 前三步能在驱动程序的DriverEntry或DispatchRoutine中完成(IRQL <= DISPATCH),但最后一步(映射缓冲区到用户地址空间)必须在使用该共享缓冲区的用户进程的上下文中完成,一般说来,应该是在最高级驱动程序的分发例程中。 取消映射的步骤如下: MmUnmapLockedPages(UserAddress, Mdl); MmUnlockPages(Mdl); //分页池 IoFreeMdl(Mdl); ExFreePool(SystemVirtualAddress); |
|
5楼#
发布于:2002-03-12 21:41
谢谢
你所说的是使用METHOD_NEITHER方式吧? UserAddress = MmMapLockedPages(Mdl, UserMode); 这一句究竟要放在什么位置? 能再解释一下吗 |
|
6楼#
发布于:2002-03-18 21:53
这与那种IO方式无关。
SystemAddress用于核心态的驱动程序,UserAddress用于WIN32应用程序,都指向同一块内存区域。 UserAddress = MmMapLockedPages(Mdl, UserMode); MmUnmapLockedPages(UserAddress, Mdl); 这两句要在分发例程(dispatch)中调用,因为此时还处于用户进程的上下文中。 |
|
7楼#
发布于:2002-06-26 17:08
还有一种方法是直接映射,我正在试。
|
|
|
8楼#
发布于:2002-06-26 17:21
本站的专栏文章里面有<Sharing Memory Between Drivers and Applications>,找来看看吧。
|
|
|