首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

usb驱动有关问题,大家看看为什么在KeWaitForSingleObject处死等不回!

2012-07-03 
usb驱动问题,大家看看为什么在KeWaitForSingleObject处死等不回!!!!我在一个IRP的取消例程中,给USB设备发

usb驱动问题,大家看看为什么在KeWaitForSingleObject处死等不回!!!!
我在一个IRP的取消例程中,给USB设备发送通知。 出现了上述问题。

C/C++ code
VOID IrpCancelRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp){    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;    IoAcquireRemoveLock(&pdx->RemoveLock, Irp);        //  Release the global cancel spin lock.      //  Do this while not holding any other spin locks so that we exit at the right IRQL.    IoReleaseCancelSpinLock(Irp->CancelIrql);    if( Irp == pdx->pBufIrp)     {         KeInitializeEvent(&event, NotificationEvent, FALSE);        //pdx->LowerDeviceObject, 已经初始化完成        irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,                        pdx->LowerDeviceObject,                        NULL,                        0,                        NULL,                        0,                        TRUE,                        &event,                        &ioStatus);        ntStatus = IoCallDriver(pdx->LowerDeviceObject, irp);        if(ntStatus == STATUS_PENDING)        {                       //在此处死等,在其他线程上先文中不存在这个问题,取消历程中,存在此问题。为啥            status = KeWaitForSingleObject(pdx->phExitEvent,Executive,ernelMode,FALSE,NULL);         }    //...其他处理    }    //取消IRP}


[解决办法]
是什么IRP的Cancel例证?

另外,在Cancel例程里面发送IRP/URB不太合适。
[解决办法]
设备扩展的事件是不是以下函数的事件对象啊??
IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject,
NULL,
0,
NULL,
0,
TRUE,
&event,
&ioStatus);
[解决办法]
为什么不是
status = KeWaitForSingleObject(&event,Executive,ernelMode,FALSE,NULL);
而是
status = KeWaitForSingleObject(pdx->phExitEvent,Executive,ernelMode,FALSE,NULL);
[解决办法]
探讨

是什么IRP的Cancel例证?

另外,在Cancel例程里面发送IRP/URB不太合适。

[解决办法]
那就要看下层驱动什么时候完成 你自己创建的这个请求了 调试下城驱动吧
[解决办法]
探讨
2:当上层应用程序异常结束时,为了消除挂起的资源而引起蓝屏,我要为步骤1中的irp设置取消例程,,由于异常结束时,驱动再清理线程时,会主动调用我这个取消例程。

[解决办法]
不明白 肯定是个很小的地方错了
[解决办法]
我来顶楼主一下,顺便做个记号

热点排行