yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
阅读:1846回复:9

SubmitUrb的结果为什么是0xC000000D?

楼主#
更多 发布于:2007-10-18 15:18
各位大大,斑竹:
今天遇到一个问题一直解决不来,请大家帮忙帮忙,谢谢!

我是用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;

请各位遇到这个问题的留言下,谢谢,能帮忙解答的更加感谢了!!!
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-28 17:33
谢谢楼上的大大

我看了设备管理器,USB设备前没有黄叹号。

driver没有ready是什么个概念呢?
firmware配合问题会是什么情况的问题呢?比如说是设备没有准备好还是什么意思呢?
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-10-26 08:52
这个问题一般是你的driver没有ready

请看一下设备管理器中你的设备是不是有黄叹号,如果不是还有可能是你的firmware的配合问题
mcu_boy
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-25 11:24
自己的帖子沉得好快,难道高手们真的都退隐江湖了?
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-19 20:38
能不能说详细一点呢?
谢谢啊
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-10-19 15:49
楼上的大大,什么意思呢?
rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-10-18 23:22
USBD_STATUS_BUFFER_UNDERRUN
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-18 21:28
又掉了,难道真的没人知道么?
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-10-18 17:04
掉了,实在是急,所以很抱歉,自己顶一个

对不起

求大大们帮帮忙了,谢谢!
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-18 15:41
各位大大,帮忙啊
游客

返回顶部