阅读:2026回复:2
关于bulkusb驱动一点疑问,请教大家
在bulkusb驱动读写例程BulkUsb_DispatchReadWrite中调用IoSetCompletionRoutine和IoCallDriver函数,将IRP处理发送到底层IO_STACK_LOCATION中处理,然后转到BulkUsb_ReadWriteCompletion函数中,问题出现了:1、在完成函数中又递归自己调用,IoCallDriver函数将IRP传给rwContext->DeviceExtension->TopOfStackDeviceObject,还是自己层的堆栈呀,不是下一层的,这是不是错误?2、在进入完成函数时先判断if(NT_SUCCESS(ntStatus)),想知道在第一个urb发送到底层后,这个返回状态是谁与该usb驱动通信的设备确认收到数据后确认的 还是底层驱动设置的确认呢??
|
|
沙发#
发布于:2015-02-06 15:27
没人回答我,顶起来
|
|
板凳#
发布于:2015-03-11 14:28
1、在完成函数中又递归自己调用,IoCallDriver函数将IRP传给rwContext->DeviceExtension->TopOfStackDeviceObject
这种情况应该是数据没收完全, 可以有两种方式 直接 IoSetCompletionRoutine 继续等回调 还有就是自已本层驱动再 IoRW 一下,其实也是再调用 IoSetCompletionRoutine 继续等 2、在进入完成函数时先判断if(NT_SUCCESS(ntStatus)),想知道在第一个urb发送到底层后,这个返回状态是谁与该usb驱动通信的设备确认收到数据后确认的 还是底层驱动设置的确认呢?? 你置了IoComplete 例程程序的话,下层驱动会干这事 完成例程中不一定是SUCCESS的, 有可能IRP 被Cancel 掉. 当然也有人会用专门的Cancel 例程处理. 也可以公用 IoCompele 例程处理 取决于 IoSetCompletionRoutine 后三个参数 |
|