liubinghan
驱动牛犊
驱动牛犊
  • 注册日期2014-08-20
  • 最后登录2015-03-25
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1895回复:2

关于bulkusb驱动一点疑问,请教大家

楼主#
更多 发布于:2015-01-26 11:07
在bulkusb驱动读写例程BulkUsb_DispatchReadWrite中调用IoSetCompletionRoutine和IoCallDriver函数,将IRP处理发送到底层IO_STACK_LOCATION中处理,然后转到BulkUsb_ReadWriteCompletion函数中,问题出现了:1、在完成函数中又递归自己调用,IoCallDriver函数将IRP传给rwContext->DeviceExtension->TopOfStackDeviceObject,还是自己层的堆栈呀,不是下一层的,这是不是错误?2、在进入完成函数时先判断if(NT_SUCCESS(ntStatus)),想知道在第一个urb发送到底层后,这个返回状态是谁与该usb驱动通信的设备确认收到数据后确认的  还是底层驱动设置的确认呢??
liubinghan
驱动牛犊
驱动牛犊
  • 注册日期2014-08-20
  • 最后登录2015-03-25
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2015-02-06 15:27
 没人回答我,顶起来
skertone
驱动牛犊
驱动牛犊
  • 注册日期2006-06-23
  • 最后登录2015-03-12
  • 粉丝0
  • 关注0
  • 积分476分
  • 威望99点
  • 贡献值0点
  • 好评度48点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 后三个参数
游客

返回顶部