阅读:2115回复:2
IRP_MN_START_DEVICE的处理程序的疑问?以下是Walter Oney书中的处理IRP_MN_START_DEVICE请求的代码(第六章的第二部分): NTSTATUS HandleStartDevice(PDEVICE_OBJECT fdo, PIRP Irp) { Irp->IoStatus.Status = STATUS_SUCCESS; NTSTATUS status = ForwardAndWait(fdo, Irp); if (!NT_SUCCESS(status)) return CompleteRequest(Irp, status, Irp->IoStatus.Information); PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); status = StartDevice(fdo, <additional args>); return CompleteRequest(Irp, status, Irp->IoStatus.Information); } 为什么在StartDevice()调用前必须要调用ForwardAndWait()? 也就是说为什么要先让低层驱动程序完成,才处理这个IRP呢?然后才处理StartDevice()? |
|
沙发#
发布于:2003-07-23 16:50
forwardandwait历程不是完成这个irp,而是将设备堆栈复制到下一层,并且将irp传给下一层驱动来处理,这是必要的,因为:
如果底层驱动没有返回成功,有可能该irp已经被标志为取消,或者处于deletepending状态,此时就没有必要做startdevice的工作了。 |
|
板凳#
发布于:2010-07-01 15:36
哦,学习了
|
|