阅读:1014回复:1
下传自己创建的IRP蓝屏了,求救啊!
我在自己的驱动里面建立了几个IRP,给它们设置了完成函数,然后在系统线程里面调用IoCallDriver。结果是执行到完成函数时(刚进入完成函数),蓝屏了。。我找来找去没发现什么问题啊?
部分代码如下: 建立IRP pIrp = IoAllocateIrp(pdx->LowerDevice->StackSize,FALSE); if (pIrp == NULL) { USBD_MODEM_KdPrint(DBGLVL_MEDIUM,("InitializeInternalUSBReadQue:Allocateing NO %d IRP failed.\n",ulIndex)); ExFreePool(pInterUrbIrp->pDataBuf); ExFreePool(pInterUrbIrp); ExFreePool(pUrb); } pInterUrbIrp->Irp = pIrp; USBD_MODEM_KdPrint(DBGLVL_HIGH,("InitializeInternalUSBReadQue():Before IoSetCompletionRoutine.\n")); IoSetCompletionRoutine(pIrp, (PIO_COMPLETION_ROUTINE) OnInternalReadComplete, pInterUrbIrp, TRUE, // InvokeOnSuccess TRUE, // InvokeOnError TRUE); // InvokeOnCancel USBD_MODEM_KdPrint(DBGLVL_HIGH,("InitializeInternalUSBReadQue():end IoSetCompletionRoutine.\n")); 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; 发送IRP的部分代码: IoQueueWorkItem(pIoWorkItem,(PIO_WORKITEM_ROUTINE) InterURBIRPWorkItemRoutine,DelayedWorkQueue,pInterUrbIrp); 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; } |
|
沙发#
发布于:2007-03-02 15:38
在完成例程里面必须把设备对象传进去,不能用完成例程的参数的设备对象。
至于为什么?我现在还不清楚。 |
|