amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1822回复:9

请教从应用程序向驱动程序传递大块数据的方法

楼主#
更多 发布于:2004-05-19 16:40
选择以缓冲区方式在应用程序与驱动程序之间交换数据,BUFFER模式和DIRECT模式,walter oney一书中提到:使用BUFFER模式,I/O管理
器创建一个足够大的的内核模式拷贝缓冲区(与用户模式输入或输出缓冲区中最大的容量相同,但不超过一个页),也就是说一次只能向驱动程序传递4KB的数据。如果我想一次想驱动程序传递10M的数据,应该采用什么办法?
shuangsy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-15
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-05-24 20:54
特定的IO_CONTROL是系统的还是可以自己定义的I/O操作,请问系统定义的I/O操作在哪能找到?
 


可以自己定义,不过要用wdm.h中定义过的CTL_CODE宏来定义。然后在驱动程序的[IRP_MJ_DEVICE_CONTROL]对应的实现函数中写出相应的处理代码就可以了。
系统定义的IO操作代码可以从NTDDK的帮助文档中查,
输入关键字IOCTL,就可以查到一堆。

不当之处,还望指正!
以德服人
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-20 14:10
“你不能在DRIVERENTRY里面锁定共享内存,必须在特定的IO_CONTROL中进行内存共享锁定,这样锁定的内存就位于调用线程的CONTEXT中,就可以在RING3层通过DEVICEIOCONTROL访问了”
  老兄这是你于: 2003/10/20 - 13:56发表的一段话
你所说的特定的IO_CONTROL是系统的还是可以自己定义的I/O操作,请问系统定义的I/O操作在哪能找到?
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-20 13:58
我看了论坛中关于内存共享的帖子大部分是在内核分配内存后用户模式的程序使用,请问有没有关于在应用程序中分配内存然后内核进行管理和使用的例子
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-05-20 12:48
如果可以确保你驱动操作内存的部分位于进程的CONTEXT中,直接传RING3地址即可,不然可能需要通过MDL的方式来锁定内存
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-20 12:45
在用户模式分配一块内存,然后在内核模式管理这块内存
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-20 12:40
能共享内存那当然好了,但是具体应该怎么操作呢,
在应用程序中开辟一块内存,将需要传递给驱动程序的数据存在这块内存中,然后通过DeviceIoControl函数将内存的起始地址传递给驱动程序,驱动程序的DeviceIoControlDispatch例程接收地址,这还是需要通过I/O管理器将应用程序的数据复制到驱动程序中,我怎么才能管理这块内存呢?
请给些参考资料吧,谢谢
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-20 12:07
我也支持wowocock的方法,简单、实用
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-05-20 11:29
最好采用共享内存的方法,最方便......

[编辑 -  5/20/04 by  wowocock]
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
9楼#
发布于:2004-05-19 22:49
数据量比较大的时候,应该使用DIRECT方式。所以10M数据最好用DIRECT方式
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
游客

返回顶部