阅读:2812回复:6
如何在驱动程序中锁定内存
小生正用WDM写一驱动,要求是在应用层分配一块内存,将基地址传入驱动软件,中断服务列程将数据写入此内存,以达到共享存储器的目的。
拜读了驱动网上的相关大作,我的方法如下: 一、APP使用DeviceIoControl传入基地址。 二、SYS中用MdlA=IoAllocateMdl(AppAdd,64012,FALSE,FALSE,NULL)建立一个Mdl。 三、用MmProbeAndLockPages(MdlA,KernelMode,IoModifyMode)锁定内存为非分页模式。 四、用SysAdd=MmMapLockedPages(MdlA,KernelMode)获得中断服务列程可用的虚拟地址。 接下来,是。。。机器死机。。。 试问各位大虾: 1.思路是否可行? 2.MmBuildMdlForNonPagedPool()是否也可锁定内存? 3.是否应用MmGetSystemAddressForMdl()获得系统空间地址? 4.APP层使用数组名得到的应是线性地址,对吗?可我使用 VirtualAlloc(NULL,64016,MEM_COMMIT,PAGE_READWRITE)分配一块内存传给SYS也不行,不知何故? 望望大虾们不吝赐教!小生感激万分! :) |
|
最新喜欢:baoyib... |
沙发#
发布于:2001-12-29 21:45
有几个方法将app的数据给sys。在deviceiocontrol中,设置METHED_BUFFER,或METHED_OUT_DIRECT,METHED_IN_DIRECT,或METHED_NETHER。
不需要再调什么函数来得到MDL。 METHED_OUT_DIRECT(可能有点错误)指out buffer的mdl在irp的mdladdress域中。类推。 |
|
板凳#
发布于:2002-01-01 00:01
感谢楼上arthurt兄弟指点。
我试过使用METHOD_IN_DIRECT及METHOD_OUT_BUFFER,,并且更正了VirtualAlloc()的正确用法,即第二参数使用MEM_COMMIT|MEM_RESERVE,情况有所好转,但中断中写的数在应用层收不到,可能是映射还有问题.我用的是: 1.app中用VirtualAlloc()及VirtualLock()分配.锁定内存. 2.使用deviceIoControl()传入地址. 3.驱动中:buffer=MemGetSystemAddressForMdl(Irp->MdlAddress),然后在中断中写数据. 还请各位指点迷径! :) |
|
地板#
发布于:2002-01-17 13:24
问题解决! ;)
|
|
地下室#
发布于:2002-01-18 08:40
可以说来看看吗?
|
|
5楼#
发布于:2003-08-25 15:19
我要达到的目的和帖主的很相似,只不是过数据传输方向不同,我是在中断的延迟处理例程里把数据写给FIFO。请大家多多分析分析,我该怎么办?
|
|
|
6楼#
发布于:2004-06-01 21:23
楼主也不说一下你的方法~~!!
|
|
|