阅读:2503回复:5
usb camer正常工作时再插入其他的usb设备驱动提交的IoCallDriver失败
可能是上次的问题写的不够详细,所以我再立了一个标题来阐述这个问题。
在正常工作时一切都是正常的,提交的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; } |
|
沙发#
发布于:2010-08-29 11:30
是不是因为周末的原因啊,基本上没有人来光顾这里?各位大侠都去喝咖啡去了?
今天找到一点点新的突破口,跟踪的结果发现正常情况下与Hang在那里的情况唯一的差距是driver层发出了一个Timeout的SRB 也就是在驱动中注册的HwInitData.HwRequestTimeoutHandler=AdapterTimeoutPacket函数 应该如何在这里做些动作呢?还是需要另外处理?我尝试取消IRP,结果蓝屏再现 希望大家都来讨论一下 谢谢 |
|
板凳#
发布于:2010-08-30 11:52
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2010-08-30 15:04
应该不是占用太宽,否则未插其他usb设备时就不会工作了。
另外是在正常工作期间插其他usb设备出现Hang在那里的情况 Win7系统就算把irp取消了,再来提交也不能成功 但是Winxp就可以再成功 但无论如何你是第一个回复的,非常感谢 |
|
地下室#
发布于:2010-12-14 16:29
你的忙我真的帮不上,我能向您求助一下吗?我也是再做一个USB的设备驱动,现在的情况是设备能被识别,驱动正常加载,但是就是采集不到数据。我是在wince5.0下 做的一个流接口函数,用的是IssueVendorTransfer()传输方式,现在 就是找不到数据,能提供帮助吗?
可以的话,能不能给我参考一下您的代码?我的邮箱是:beizhou123@163.com 谢谢 |
|
5楼#
发布于:2011-01-17 15:59
用户被禁言,该主题自动屏蔽! |
|