我在一个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);
------解决方案--------------------
------解决方案--------------------
那就要看下层驱动什么时候完成 你自己创建的这个请求了 调试下城驱动吧
------解决方案--------------------
------解决方案--------------------
不明白 肯定是个很小的地方错了
------解决方案--------------------
我来顶楼主一下,顺便做个记号