mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2945回复:13

如何取消一个pending的bulk read?(已解决)

楼主#
更多 发布于:2003-11-10 10:09
我开启一个(readthread)线程在一个端点上读数,由于这个时候端点上没有数据,因此线程停在readpipe上。这时我在主线程调用URB_FUNCTION_ABORT_PIPE,希望能够使readthread跳过readpipe向下执行,应该没有问题吧。但是我的主线程又停在URB_FUNCTION_ABORT_PIPE上了!
在ddk help 中写道:

URB_FUNCTION_ABORT_PIPE is a general-purpose request that enables a client to cancel any pending transfers for the specified pipe.

URB_FUNCTION_RESET_PIPE is a general-purpose request that enables a client to clear the stalled state of a pipe within the USB stack. Transfers will resume with the next URB queued for the endpoint.

问题:    
1、为什么ABORT_PIPE会失败呢?(RESET_PIPE 也不行)
2、应该怎样解决?
3、URB_FUNCTION_RESET_PIPE 能用吗?

谢谢!





[编辑 -  11/10/03 by  mmcall]

[编辑 -  11/11/03 by  mmcall]

最新喜欢:

xiao_lzmxiao_l...
wgq
wgq
驱动小牛
驱动小牛
  • 注册日期2001-07-23
  • 最后登录2013-12-09
  • 粉丝3
  • 关注0
  • 积分40分
  • 威望342点
  • 贡献值0点
  • 好评度97点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-18 17:06
问题解决方法2:(有兴趣可以尝试)
在应用程序中也可以解决该问题。如果驱动中没有处理超时问题的话。
在应用程序中想终止一个BULK读写操作,需要重新对该设备创建一个新句柄,使用新的设备句柄发送终止管道的命令即可以解决该问题。完成后别忘了释放句柄!
 :)
qq
kuangfeng888
驱动牛犊
驱动牛犊
  • 注册日期2004-11-18
  • 最后登录2004-11-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-18 10:13
谢谢这里的哥们,解决了我的大问题。
看来这里的确是个好地方。我会常来交流的!
xiao_lzm
驱动牛犊
驱动牛犊
  • 注册日期2003-02-17
  • 最后登录2008-11-03
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-13 13:23
也许我的设备(在有的PC上跑死)也是这个问题,我去试试,顺便顶一下。
用自己的双脚走路。
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-11 17:24
ding
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-11 16:03
不错!
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-11 15:00
恭喜!我也学到了! :)
二姑家的猫想......
mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-11 14:21
终于搞定!

超时判断+cancel irp

CallUSBD()
{
   ……
   KeInitializeEvent(&event, NotificationEvent, FALSE);

   irp = IoBuildDeviceIoControlRequest(
             IOCTL_INTERNAL_USB_SUBMIT_URB,
             pdx->StackDeviceObject,
             NULL,
             0,
             NULL,
             0,
             TRUE, /* INTERNAL */
             &event
             &ioStatus);

  ntStatus = IoCallDriver(pdx->StackDeviceObject,irp);

   if (ntStatus == STATUS_PENDING)
   {
      LARGE_INTEGER timeout;
      timeout.QuadPart = -1000000*2; //200 ms

      status = KeWaitForSingleObject  
               (&event,Suspended,
                KernelMode,FALSE,&timeout);
    
 if (status == STATUS_TIMEOUT)
 {
 IoCancelIrp(irp);
 ntStatus = STATUS_UNSUCCESSFUL;
 KeWaitForSingleObject
                              (&event,Suspended,
                              KernelMode,FALSE,NULL);
 }
 else
 ntStatus = STATUS_SUCCESS;
   }
   else
   {
      ioStatus.Status = ntStatus;

   }
    ……
}
mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-11-10 14:07
to kilroy_guo:
我就是用的ezusb,也试过abort all
pipes,都不行啊。
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-11-10 13:44
ezusb代码里面有abort pipe的函数,你看看它的用法:
它的函数Ezusb_HandleRemoveDevice里面就是这样做的,abort all
pipes。你用过不行么?
二姑家的猫想......
mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-11-10 13:18
确实是bulk。

是否可以用IoCancelIrp(irp)?
但是如何在一个Irp中找到read的那个irp呢?
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-11-10 12:29
明白你的意思,你的情况是读请求送下去了,设备方还没给你返回数据,没有回应。iso传输不会这样,你说的应该是bulk传输,我就不清楚bulk了,我认为可能韧件部分要针对没有数据的情况做特殊处理了,比如返回一堆\"ff\"给你。也许bulk有其他方式可以终止正在进行的传输,你要请教他人了
二姑家的猫想......
mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-11-10 10:48
to kilroy_guo:

谢谢你!

问题是我线程中已经停在readpipe上。
而且我不愿意主线程强制TerminateThread()
所以正象你所说置一个变量,让线程(readthread)自己ExitThread()。

我该怎么办呢?
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-11-10 10:38
为什么要abort?
你可以置一个变量,给你的线程来判断是否跳过往下走
主线程想要终止线程的时候,设置那个变量,然后再abort或者reset
二姑家的猫想......
游客

返回顶部