summerfruit
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2013-12-07
  • 粉丝0
  • 关注0
  • 积分395分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
阅读:1390回复:0

internal IRP 下传失败

楼主#
更多 发布于:2007-02-13 17:14
  我建立了几个internal IRP。
pIrp = IoAllocateIrp(pdx->LowerDevice->StackSize,FALSE);
        if (pIrp == NULL)
        {
            ExFreePool(pInterUrbIrp->pDataBuf);
            ExFreePool(pInterUrbIrp);
            ExFreePool(pUrb);
        }
        pInterUrbIrp->Irp = pIrp;
        
        IoSetCompletionRoutine(pIrp,
                                (PIO_COMPLETION_ROUTINE) OnInternalReadComplete,
                                pInterUrbIrp,
                                TRUE,        // InvokeOnSuccess
                                TRUE,        // InvokeOnError
                                TRUE);       // InvokeOnCancel

            
        pIrp->Cancel = FALSE;

        //  Obtain access to the next-lower driver's I/O stack location in our |
        //  IRP so that we can set up the IRP for the lower-level driver.      |

        pStack = IoGetNextIrpStackLocation(pIrp);

        // Now set up the parameters for that driver...
        pStack->MajorFunction                            = IRP_MJ_INTERNAL_DEVICE_CONTROL;
        pStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
        pStack->Parameters.Others.Argument1              = pUrb;
然后用系统线程来发送它
IoQueueWorkItem(pIoWorkItem,(PIO_WORKITEM_ROUTINEInterURBIRPWorkItemRoutine,DelayedWorkQueue,pInterUrbIrp);
ROUTINEInterURBIRPWorkItemRoutine如下
VOID InterURBIRPWorkItemRoutine (IN PDEVICE_OBJECT pFdo,IN PVOID pContext)
{
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pFdo->DeviceExtension;
    PInternalURBEntry pInterUrbIrp = (PInternalURBEntry)pContext;

    USBD_MODEM_KdPrint(DBGLVL_MINIMUM,("InterURBIRPWorkItemRoutine:Enter.\n"));
    //send pInterUrbIrp->Irp to USB bus driver.
    IoCallDriver(pdx->LowerDevice,pInterUrbIrp->Irp);//出错???????
    //free workitem.
    IoFreeWorkItem(pInterUrbIrp->pWorkItem);
    //AddIntoInterURBThread(pFdo,pContext);

    USBD_MODEM_KdPrint(DBGLVL_MINIMUM,("InterURBIRPWorkItemRoutine:Exit.\n"));
    return;
}

结果SOFTICE错误是NO_MORE_IRP_STACK_LOCATIONS.

怎么回事啊?
游客

返回顶部