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

下传自己创建的IRP蓝屏了,求救啊!

楼主#
更多 发布于:2007-03-01 11:27
  我在自己的驱动里面建立了几个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;
}
summerfruit
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2013-12-07
  • 粉丝0
  • 关注0
  • 积分395分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-02 15:38
在完成例程里面必须把设备对象传进去,不能用完成例程的参数的设备对象。
至于为什么?我现在还不清楚。
游客

返回顶部