reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
阅读:2503回复:5

usb camer正常工作时再插入其他的usb设备驱动提交的IoCallDriver失败

楼主#
更多 发布于:2010-08-28 09:35
可能是上次的问题写的不够详细,所以我再立了一个标题来阐述这个问题。

在正常工作时一切都是正常的,提交的IoCallDriver都能够及时的返回,但是当我在工作的时候再插入其他的usb设备,只要是usb设备,
甚至是U盘都会在拔掉这个usb设备时导致我自己的driver在提交IoCallDriver时Hung在调用IoCallDriver的地方,也可以说是注册的完成线程没有被调用。
但是其他的对设备的控制命令都可以正常工作

另外提交这个irp的端点是2号端点,bulk传输方式。

期望大家帮忙多提一下建议


具体的代码如下:

UINT UsbBulkRx(IN PHW_DEVICE_EXTENSION pDevExt,IN  PUCHAR ReadBuffer, ULONG ReadBufferSize,
               PURB pUrb, PIRP pIrp)
{
    NTSTATUS              ntStatus = STATUS_SUCCESS;
    PIO_STACK_LOCATION    nextStack;
    CCHAR                 StackSize;

    ULONG                  Size;
    PUSBD_PIPE_INFORMATION pipeInformation;
    
    if (pUrb)
    {
        pipeInformation = &pDevExt->Interface->Pipes[ISOPIPE];
        Size = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
        RtlZeroMemory(pUrb, Size);
        pUrb->UrbBulkOrInterruptTransfer.Hdr.Length = (USHORT) Size;
        pUrb->UrbBulkOrInterruptTransfer.Hdr.Function =  URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
        pUrb->UrbBulkOrInterruptTransfer.PipeHandle =pipeInformation->PipeHandle;
                  
        pUrb->UrbBulkOrInterruptTransfer.TransferFlags =USBD_TRANSFER_DIRECTION_IN;

        pUrb->UrbBulkOrInterruptTransfer.TransferFlags |= USBD_SHORT_TRANSFER_OK;            
 
        pUrb->UrbBulkOrInterruptTransfer.UrbLink = NULL;

        pUrb->UrbBulkOrInterruptTransfer.TransferBufferMDL =NULL;

        
        //GpUrb->UrbBulkOrInterruptTransfer.TransferBufferLength =DESIRESIZE;
        pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength = ReadBufferSize;
            //revised by Andy
        pUrb->UrbBulkOrInterruptTransfer.TransferBuffer=ReadBuffer;
        
        //ntStatus=USBISO_CallUSBD(pDevExt,pUrb);  //removed by Andy


        if (pIrp == NULL)
        {
            ntStatus =  STATUS_UNSUCCESSFUL;            
            return ntStatus;
        }

        StackSize=(CCHAR)(pDevExt->StackDeviceObject->StackSize);
        IoInitializeIrp(pIrp,pIrp->Size,StackSize);
        nextStack = IoGetNextIrpStackLocation(pIrp);
        nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
        nextStack->Parameters.DeviceIoControl.IoControlCode =  IOCTL_INTERNAL_USB_SUBMIT_URB;
        nextStack->Parameters.Others.Argument1 = pUrb;

        IoSetCompletionRoutine(pIrp,USBISO_CallUsbdCompletion, pDevExt, TRUE, TRUE,TRUE);
                if(pIrp==pDevExt->GpIrp1)
                        COGENTDBG(COGENT_DEBUG,("UsbBulkRx test irp1 -level=%d\r\n",KeGetCurrentIrql()));
                else
                        COGENTDBG(COGENT_DEBUG,("UsbBulkRx test irp2 -level=%d\r\n",KeGetCurrentIrql()));
              
        ntStatus = IoCallDriver(pDevExt->StackDeviceObject,pIrp);
                if(gRemove == TRUE)
                {
                        IoCancelIrp(pIrp);
                }
        COGENTDBG(COGENT_DEBUG,("UsbBulkRx test -status=%d,gRe=%d\r\n",ntStatus,gRemove));
        return ntStatus;
    }
    
    return 0;
}
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-08-29 11:30
是不是因为周末的原因啊,基本上没有人来光顾这里?各位大侠都去喝咖啡去了?

今天找到一点点新的突破口,跟踪的结果发现正常情况下与Hang在那里的情况唯一的差距是driver层发出了一个Timeout的SRB
也就是在驱动中注册的HwInitData.HwRequestTimeoutHandler=AdapterTimeoutPacket函数

应该如何在这里做些动作呢?还是需要另外处理?我尝试取消IRP,结果蓝屏再现
希望大家都来讨论一下

谢谢
eaatcc
禁止发言
禁止发言
  • 注册日期2006-04-21
  • 最后登录2018-12-27
  • 粉丝0
  • 关注0
  • 积分6884分
  • 威望34869点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2010-08-30 11:52
用户被禁言,该主题自动屏蔽!
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-08-30 15:04
应该不是占用太宽,否则未插其他usb设备时就不会工作了。
另外是在正常工作期间插其他usb设备出现Hang在那里的情况
Win7系统就算把irp取消了,再来提交也不能成功
但是Winxp就可以再成功

但无论如何你是第一个回复的,非常感谢
wchunlei
驱动牛犊
驱动牛犊
  • 注册日期2010-11-10
  • 最后登录2010-12-22
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-12-14 16:29
你的忙我真的帮不上,我能向您求助一下吗?我也是再做一个USB的设备驱动,现在的情况是设备能被识别,驱动正常加载,但是就是采集不到数据。我是在wince5.0下 做的一个流接口函数,用的是IssueVendorTransfer()传输方式,现在 就是找不到数据,能提供帮助吗?

可以的话,能不能给我参考一下您的代码?我的邮箱是:beizhou123@163.com
谢谢
eaatcc
禁止发言
禁止发言
  • 注册日期2006-04-21
  • 最后登录2018-12-27
  • 粉丝0
  • 关注0
  • 积分6884分
  • 威望34869点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2011-01-17 15:59
用户被禁言,该主题自动屏蔽!
游客

返回顶部