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驱动开发的人好少?!!!求高手解答!