IoMarkIrpPending破坏别的内存


   
  SOMETYPE SomeFunction()
  

{

PIRP irp = IoBuildAsynchronousFsdRequest(...);

IoSetCompleteRoutine(irp, MyCompleteRoutine, ...);

IoCallDriver(...);

}

NTSTATUS MyCompletionRoutine(PDEVCIE_OBJECT junk, PIRP irp, PVOID context)

{

if (Irp->PendingReturned)

{

IoMarkIrpPending(irp);

}

IoFreeIrp(irp);

return STATUS_MORE_PROCESISING_REQUIRED;

}

由于这里已经没有与之对应的IRP栈,所以IoMarkIrpPending设置的标志会破坏别的内存?

IoBuildAsynchronousFsdRequest创建了一个异步IRP,完成例程用来释放这个IRP,可是完成例程返回的又是STATUS_MORE_PROCESISING_REQUIRED,调用IoMarkIrpPending就有问题了,那么这个时候IoMarkIrpPending设置的标志会破坏别的内存是怎么回事?
是因为异步IRP会调用APC,在任意上下文中,检索不到对应的IRP栈?

《Programming the Microsoft Windows Driver Model》中的一段解释:
如果驱动程序分配了IRP ,安装了完成例程,然后在未改变堆栈指针的情况下调用IoCallDriver,
那么完成例程就不应该包含这两行代码,因为没有堆栈单元与你的驱动程序关联。( 这种情况与完成例程的设备
对象参数为NULL 的情形类似。驱动程序通常做的是分配一个带有额外堆栈单元的IRP ,在第一个单元中设置
DeviceObject 指针,在调用IoSetCompletionRoutine 和IoCallDriver 前用IoSetNextIrpStackLocation 函数跳过
那个额外堆栈单元。如果你这样做,那么在完成例程中调用 IoMarkIrpPending 将不会出现问题,并且完成例程
也能得到了一个有效的设备对象) 。

同样不是很明白!
windows驱动开发的人好少?!!!求高手解答!

驱动 windows

Sobear 13 years, 6 months ago

Your Answer