FsRtlpRemoveAndCompleteWaitingIrp
VOID __stdcall FsRtlpRemoveAndCompleteWaitingIrp(_WAITING_IRP *WaitingIrp){
INT64 v1;
INT64 v2;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
_IRP *Irp;
Flink = WaitingIrp->Links.Flink;
if( (_WAITING_IRP *)Flink->Blink != WaitingIrp
|| (Blink = WaitingIrp->Links.Blink, (_WAITING_IRP *)Blink->Flink != WaitingIrp) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
Irp = WaitingIrp->Irp;
if( Irp )
{
Irp->CancelIrql = KeAcquireQueuedSpinLock(7i64, v1, v2);
_InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
Irp->IoStatus.Information = WaitingIrp->Information;
Irp->IoStatus.Status = Irp->Cancel != 0 ? 0xC0000120 : 0;
}
WaitingIrp->CompletionRoutine(WaitingIrp->Context, Irp);
ExFreePoolWithTag(WaitingIrp, 0);
}Referenced by:
FsRtlpAcknowledgeOplockBreak
FsRtlpAcknowledgeOplockBreakByCacheFlags
FsRtlpCancelExclusiveIrp
FsRtlpCancelWaitingIrp
FsRtlpOpBatchBreakClosePending
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockBreakToII
FsRtlpOplockBreakToNone
FsRtlpOplockCleanup
FsRtlpReleaseIrpsWaitingForRH
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock
FsRtlpWaitOnIrp