阅读:1390回复:0
internal IRP 下传失败
我建立了几个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. 怎么回事啊? |
|