阅读:1845回复:9
SubmitUrb的结果为什么是0xC000000D?
各位大大,斑竹:
今天遇到一个问题一直解决不来,请大家帮忙帮忙,谢谢! 我是用DS进行USB等时传输的驱动开发,在Endpoint2的输入口采用以下方法读取USB设备往上传输的数据。但是在提交IRP之后,在完成例程里看到的status总是0xC000000D,即USBD_STATUS_BUFFER_UNDERRUN(上次写成STATUS_INVALID_PARAMETERS是错的,谢谢帖子中某大大的提醒),请大家帮忙看看哪里错了,谢谢谢谢!! 代码如下: Read代码: t << "Entering UsbDriverDevice::Read, " << I << EOL; NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES; I.Information() = 0; PVOID pBuffer = I.BufferedReadDest(); ULONG dwTotalSize = I.ReadSize(CURRENT); ULONG ulNumPackets = dwTotalSize / ISOC_PACKET_SIZE; if ( ulNumPackets * ISOC_PACKET_SIZE < dwTotalSize ) ulNumPackets ++; PURB pUrb = m_Endpoint2IN.BuildIsochronousTransfer( ulNumPackets, // # packets ISOC_PACKET_SIZE, // packet size TRUE, // bIn TRUE, // bASAP 0, // Start Frame pBuffer, // pBuffer dwTotalSize // Length ); ASSERT(pUrb); if ( !pUrb ) { ASSERT ( pUrb != 0 ); delete pBuffer; return I.PnpComplete(STATUS_INSUFFICIENT_RESOURCES, IO_NO_INCREMENT); } // Do not get an error on short or zero length packets pUrb->UrbIsochronousTransfer.TransferFlags = USBD_SHORT_TRANSFER_OK; _URB_HEADER *pUHdr = (_URB_HEADER *)pUrb; _URB_ISOCH_TRANSFER *pIsoc = &pUrb->UrbIsochronousTransfer; pUHdr->UsbdDeviceHandle = NULL; pUHdr->UsbdFlags = 0; PISOC_CONTEXT pContext = new (NonPagedPool) ISOC_CONTEXT; ASSERT(pContext); if ( !pContext ) { delete pUrb; return I.PnpComplete(STATUS_INSUFFICIENT_RESOURCES, IO_NO_INCREMENT); } for (ULONG i=0; i<ulNumPackets; i++) pUrb->UrbIsochronousTransfer.IsoPacket.Offset = i*ISOC_PACKET_SIZE; pContext->pDev = this; pContext->pIrp = I; pContext->pUrb = pUrb; pContext->pData = pBuffer; pContext->pMdl = NULL; status = m_Endpoint2IN.SubmitUrb( pUrb, LinkTo(UsbIsocReadComplete), pContext ); if ( !NT_SUCCESS(status) ) { t << "Submission of Isoc Read URB FAILED (status=" << (ULONG)status << ")!\n"; 在这里输出的值为0xC000000D } if(status == STATUS_PENDING) I.MarkPending(); //This is the normal case. else if(!NT_SUCCESS(status)) I.PnpComplete(status); return status; ReadComplete代码: NTSTATUS status = I.Status(); 这里看到的status也是0xC000000D PUCHAR pBuffer = (PUCHAR)pContext->pData; ULONG dwTotalSize = pContext->pUrb->UrbIsochronousTransfer.TransferBufferLength; ULONG dwBytesRead = 0; _URB_ISOCH_TRANSFER *pIsoc = &pContext->pUrb->UrbIsochronousTransfer; PUSBD_ISO_PACKET_DESCRIPTOR ppd; int NumPackets = dwTotalSize / ISOC_PACKET_SIZE; for (int i=0; i<NumPackets; i++) { ppd = &pIsoc->IsoPacket; if ( USBD_SUCCESS(ppd->Status) && (ppd->Length > 0) ) { PUCHAR p = ((UCHAR *)pIsoc->TransferBuffer) + ppd->Offset; memcpy(pBuffer+dwBytesRead, p, ppd->Length); dwBytesRead += ppd->Length; } } KIrp origI(pContext->pIrp); if ( pContext->pUrb ) delete pContext->pUrb; if ( pContext->pMdl ) delete pContext->pMdl; if ( pContext->pData ) delete pContext->pData; delete pContext; origI.Information() = dwBytesRead; if (origI->PendingReturned) origI.MarkPending(); origI.PnpComplete(status, IO_NO_INCREMENT); return STATUS_SUCCESS; 请各位遇到这个问题的留言下,谢谢,能帮忙解答的更加感谢了!!! |
|
沙发#
发布于:2007-10-18 15:41
各位大大,帮忙啊
急 |
|
板凳#
发布于:2007-10-18 17:04
掉了,实在是急,所以很抱歉,自己顶一个
对不起 求大大们帮帮忙了,谢谢! |
|
地板#
发布于:2007-10-18 21:28
又掉了,难道真的没人知道么?
|
|
地下室#
发布于:2007-10-18 23:22
USBD_STATUS_BUFFER_UNDERRUN
|
|
5楼#
发布于:2007-10-19 15:49
楼上的大大,什么意思呢?
|
|
6楼#
发布于:2007-10-19 20:38
能不能说详细一点呢?
谢谢啊 |
|
7楼#
发布于:2007-10-25 11:24
自己的帖子沉得好快,难道高手们真的都退隐江湖了?
|
|
8楼#
发布于:2007-10-26 08:52
这个问题一般是你的driver没有ready
请看一下设备管理器中你的设备是不是有黄叹号,如果不是还有可能是你的firmware的配合问题 |
|
|
9楼#
发布于:2007-10-28 17:33
谢谢楼上的大大
我看了设备管理器,USB设备前没有黄叹号。 driver没有ready是什么个概念呢? firmware配合问题会是什么情况的问题呢?比如说是设备没有准备好还是什么意思呢? |
|