阅读:1820回复:9
请教从应用程序向驱动程序传递大块数据的方法
选择以缓冲区方式在应用程序与驱动程序之间交换数据,BUFFER模式和DIRECT模式,walter oney一书中提到:使用BUFFER模式,I/O管理
器创建一个足够大的的内核模式拷贝缓冲区(与用户模式输入或输出缓冲区中最大的容量相同,但不超过一个页),也就是说一次只能向驱动程序传递4KB的数据。如果我想一次想驱动程序传递10M的数据,应该采用什么办法? |
|
沙发#
发布于:2004-05-19 22:49
数据量比较大的时候,应该使用DIRECT方式。所以10M数据最好用DIRECT方式
|
|
|
板凳#
发布于:2004-05-20 11:29
最好采用共享内存的方法,最方便......
[编辑 - 5/20/04 by wowocock] |
|
|
地板#
发布于:2004-05-20 12:07
我也支持wowocock的方法,简单、实用
|
|
|
地下室#
发布于:2004-05-20 12:40
能共享内存那当然好了,但是具体应该怎么操作呢,
在应用程序中开辟一块内存,将需要传递给驱动程序的数据存在这块内存中,然后通过DeviceIoControl函数将内存的起始地址传递给驱动程序,驱动程序的DeviceIoControlDispatch例程接收地址,这还是需要通过I/O管理器将应用程序的数据复制到驱动程序中,我怎么才能管理这块内存呢? 请给些参考资料吧,谢谢 |
|
5楼#
发布于:2004-05-20 12:45
在用户模式分配一块内存,然后在内核模式管理这块内存
|
|
6楼#
发布于:2004-05-20 12:48
如果可以确保你驱动操作内存的部分位于进程的CONTEXT中,直接传RING3地址即可,不然可能需要通过MDL的方式来锁定内存
|
|
|
7楼#
发布于:2004-05-20 13:58
我看了论坛中关于内存共享的帖子大部分是在内核分配内存后用户模式的程序使用,请问有没有关于在应用程序中分配内存然后内核进行管理和使用的例子
|
|
8楼#
发布于:2004-05-20 14:10
“你不能在DRIVERENTRY里面锁定共享内存,必须在特定的IO_CONTROL中进行内存共享锁定,这样锁定的内存就位于调用线程的CONTEXT中,就可以在RING3层通过DEVICEIOCONTROL访问了”
老兄这是你于: 2003/10/20 - 13:56发表的一段话 你所说的特定的IO_CONTROL是系统的还是可以自己定义的I/O操作,请问系统定义的I/O操作在哪能找到? |
|
9楼#
发布于:2004-05-24 20:54
特定的IO_CONTROL是系统的还是可以自己定义的I/O操作,请问系统定义的I/O操作在哪能找到? 可以自己定义,不过要用wdm.h中定义过的CTL_CODE宏来定义。然后在驱动程序的[IRP_MJ_DEVICE_CONTROL]对应的实现函数中写出相应的处理代码就可以了。 系统定义的IO操作代码可以从NTDDK的帮助文档中查, 输入关键字IOCTL,就可以查到一堆。 不当之处,还望指正! |
|
|