FsRtlpCancelWaitingIrp
VOID __stdcall FsRtlpCancelWaitingIrp(_IRP *Irp, UINT8 CallerAcquiredMutex){
unsigned __int64 Information;
_WAITING_IRP *i;
_WAITING_IRP *v5;
_IRP *v6;
Information = Irp->IoStatus.Information;
_InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
if( !CallerAcquiredMutex )
ExAcquireFastMutex(*(PFAST_MUTEX *)(Information + 152));
for( i = *(_WAITING_IRP **)(Information + 88);
i != (_WAITING_IRP *)(Information + 88);
i = (_WAITING_IRP *)i->Links.Flink )
{
v5 = i;
v6 = i->Irp;
if( v6 )
{
if( v6->Cancel )
{
i = (_WAITING_IRP *)i->Links.Blink;
FsRtlpRemoveAndCompleteWaitingIrp(v5);
}
}
}
if( !CallerAcquiredMutex )
KeReleaseGuardedMutex(*(PKGUARDED_MUTEX *)(Information + 152));
}Referenced by:
FsRtlpWaitOnIrp
FsRtlpWaitingIrpCancelRoutine