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