-
-
[求助]bulkusb中的读写例程中返回STATUS_PENDING后,再没做处理,为什么?
-
发表于:
2013-1-29 18:44
4752
-
[求助]bulkusb中的读写例程中返回STATUS_PENDING后,再没做处理,为什么?
在DDk的bulkusb的读写中将irp转发给pdo后,直接返回status_pending了而没有再对该irp做结束处理,这样的代码不是有问题吗?
先将读写例程和完成例程简化如下:
NTSTATUS
BulkUsb_DispatchReadWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
//初始化变量,构建mdl,创建urb,设置下层io栈等等
...
//设置完成例程
IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)BulkUsb_ReadWriteCompletion, rwContext, TRUE,TRUE,TRUE);
//阻塞irp
IoMarkIrpPending(Irp);
//将irp转发到下层usb总线驱动
ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,Irp);
//返回挂起状态
return STATUS_PENDING
}
通过设置完成例程,可将大传输量拆分为多次传输得以完成。现假设在传输字节很少,以至于一次就可完成传输的情况下,完成例程可简化如下:
NTSTATUS
BulkUsb_ReadWriteCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
ntStatus = Irp->IoStatus.Status;
Irp->IoStatus.Information = rwContext->Numxfer;
return ntStatus;
}
这样就有疑问:
读写例程中将irp挂起后,转发给下层处理,并直接返回status_pending,后续应该还有对irp的处理啊?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!