阅读:2692回复:1
完成例程的问题(Irp->PendingReturned到底因该怎么处理?)
这是我将一buffer传给完成例程
*nextIrpStack = *currentIrpStack; IoSetCompletionRoutine(Irp, IKWriteFileComplete,inbuffer, TRUE,TRUE,TRUE); 这是我的完成例程 NTSTATUS IKWriteFileComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ) { PIO_STACK_LOCATION myIrpSp=IoGetCurrentIrpStackLocation( Irp ); ULONG length=myIrpSp->Parameters.Write.Length; 。。。 RtlZeroMemory(getbuffer,length); RtlCopyMemory(getbuffer,Context,length); ExFreePool(Context); if(Irp->PendingReturned) { IoMarkIrpPending(Irp); return STATUS_SUCCESS; } return STATUS_SUCCESS; } 在完成例程里面取得inbuffer然后进行处理,处理完了后free它 但是居然有的时候free它的时候居然产生了bad pool call,怎么会这样? 哪位大虾能不能解释清楚一点Irp->PendingReturned的处理过程? 也就是完成例程的处理过程。 谢谢! |
|
|
沙发#
发布于:2003-07-29 09:50
在COMPLETION ROUTINE被调用时刻, MEMORY可能已经被UNLOCK. IRP可能被改动, 有N种状况. 不是有一定的规则的. 你的代码没有贴全, 无法看到问题所在.
|
|
|