zhangkf
驱动牛犊
驱动牛犊
  • 注册日期2001-07-26
  • 最后登录2002-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2812回复:6

如何在驱动程序中锁定内存

楼主#
更多 发布于:2001-12-28 23:08
小生正用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也不行,不知何故?

望望大虾们不吝赐教!小生感激万分!

 :)

最新喜欢:

baoyibao99baoyib...
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于: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域中。类推。
zhangkf
驱动牛犊
驱动牛犊
  • 注册日期2001-07-26
  • 最后登录2002-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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),然后在中断中写数据.
   还请各位指点迷径! :)
zhangkf
驱动牛犊
驱动牛犊
  • 注册日期2001-07-26
  • 最后登录2002-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-17 13:24
问题解决! ;)
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-01-18 08:40
可以说来看看吗?
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-25 15:19
我要达到的目的和帖主的很相似,只不是过数据传输方向不同,我是在中断的延迟处理例程里把数据写给FIFO。请大家多多分析分析,我该怎么办?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-01 21:23
楼主也不说一下你的方法~~!!
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
游客

返回顶部