FsRtlpCancelOplockRHIrp

VOID __stdcall FsRtlpCancelOplockRHIrp(_IRP *Irp, UINT8 CallerAcquiredMutex, UINT8 ReleaseWaitingIrps){
  _NONOPAQUE_OPLOCK *Information; 
  char v6; 
  _LIST_ENTRY *p_IrpOplocksRH; 
  _LIST_ENTRY *i; 
  NTSTATUS IsEnabled; 
  _LIST_ENTRY *Flink; 
  INT64 v11; 
  INT64 v12; 
  UINT64 AccessMode; 

  Information = (_NONOPAQUE_OPLOCK *)Irp->IoStatus.Information;
  _InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
  v6 = 0;
  if( !CallerAcquiredMutex )
    ExAcquireFastMutex(Information->FastMutex);
  p_IrpOplocksRH = &Information->IrpOplocksRH;
  for( i = Information->IrpOplocksRH.Flink; i != p_IrpOplocksRH; i = i->Flink )
  {
    if( !i[3].Blink && BYTE4(i[1].Flink[4].Flink) )
    {
      i = i->Blink;
      IsEnabled = Feature_Servicing_39887415__private_IsEnabled();
      Flink = i->Flink;
      if( IsEnabled )
      {
        LODWORD(v12) = 0;
        LODWORD(v11) = 0;
        FsRtlpRemoveAndCompleteRHIrp(Flink, Information, 3221225760i64, 0i64, v11, v12, 0);
      }
      else
      {
        LODWORD(AccessMode) = 0;
        LODWORD(v12) = 0;
        LODWORD(v11) = 0;
        FsRtlpRemoveAndBreakRHIrp(Flink, Information, 1u, 3221225760i64, v11, v12, AccessMode, 0);
      }
      v6 = 1;
    }
  }
  if( v6 )
  {
    if( ReleaseWaitingIrps )
      FsRtlpReleaseIrpsWaitingForRH(Information);
    if( p_IrpOplocksRH->Flink == p_IrpOplocksRH )
      FsRtlpComputeShareableOplockState(Information);
  }
  if( !CallerAcquiredMutex )
    KeReleaseGuardedMutex(Information->FastMutex);
}

Referenced by:

FsRtlpOplockRHIrpCancelRoutine
FsRtlpRequestShareableOplock