阅读:5476回复:6
IoBuildDeviceIoControlRequest()构造IRP的问题
我在系统线程中循环地用IoBuildDeviceIoControlRequest()构造一个irp发给下层驱动取USB设备数据,那么我构造的irp在处理完以后该怎么处置它?
1、用IoFreeIrp(irp)释放这个irp? 2、用IoCompleteRequest (irp, IO_NO_INCREMENT )完成这个irp? 3、置之不理,听之任之? 请教个位名门正派的长老,我该怎么做呢? |
|
最新喜欢:![]()
|
沙发#
发布于:2003-07-21 18:00
我认为应该IoFreeIrp就OK,但必须IoCompleteRequest原来传进来的IRP。
具体可以参考DDK中的例子。 |
|
板凳#
发布于:2003-07-21 18:59
我认为应该IoFreeIrp就OK,但必须IoCompleteRequest原来传进来的IRP。我是在线程里做这件事的,根本没有原来传进来的irp。我现在的问题是,一旦我IoFreeIrp,或者IoCompleteRequest 这个通过IoBuildDeviceIoControlRequest构造的irp,系统就崩溃了。我看ddk的文档说IoBuildDeviceIoControlRequest构造的irp最后是要通过IoCompleteRequest来处理的,到底怎么做呢? |
|
|
地板#
发布于:2003-07-21 22:32
我在系统线程中循环地用IoBuildDeviceIoControlRequest()构造一个irp发给下层驱动取USB设备数据,那么我构造的irp在处理完以后该怎么处置它? IoBuildDeviceIoControlRequest 生成的 IRP 由 I\\O 管理器释放。 |
|
|
地下室#
发布于:2003-07-22 10:13
请问swf2003兄:
用IoBuildDeviceIoControlRequest构造的irp可以反复使用吗?因为我觉得我的驱动里开了个线程,内存使用量在不停地上涨,我想是不是构造的irp没被释放的原因。然后我又想,反正线程里要反复地构造irp然后发送到下层驱动,那还不如我在线程刚开始时就构造好一个irp,然后保存起来,在线程循环里反复使用这个irp,不用在每次使用时再构造了,这样行吗? |
|
|
5楼#
发布于:2003-07-22 10:41
IoBuildDeviceIoControlRequest构造的irp是synchronous的IRP,
当你调用IoCompleteRequest时,I/O Manager会帮你清除这个IRP, 所以你不用自己IoFreeIrp。 只要你不IoCompleteRequest这个Irp,是可以重复使用的。注意 不能使用IoReuseIrp例程,Walter Oney的《programming the Microsoft Windows Driver Model》中好像有个usb的loop back的 例子,里面用过这种方法。 |
|
6楼#
发布于:2004-02-13 09:57
请问 swf2003
不管有无 IRP_MJ_READ 来,我都要从usb设备取数据。 这个Irp,应如何创建? 我的usb设备没提供IoBuildDeviceIoControlRequest读数据的控制。 我用IoBuildAsynchronousFsdRequest() 建Irp, 再建Urb,用IoCallDriver(),返回 status = OxC0000010, 无效的请求包。 我应该如何处理, 谢谢大家指点。 |
|