FsRtlpCancelOplockRHIrp

VOID __stdcall FsRtlpCancelOplockRHIrp(_IRP *Irp, UINT8 CallerAcquiredMutex, UINT8 ReleaseWaitingIrps){
  _NONOPAQUE_OPLOCK *v5; 
  char v6; 
  _LIST_ENTRY *p_IrpOplocksRH; 
  _LIST_ENTRY *i; 
  int IsEnabled; 
  _LIST_ENTRY *Flink; 
  INT64 v11; 
  INT64 v12; 
  UINT64 v13; 
  v5 = (_NONOPAQUE_OPLOCK *)*((_QWORD *)Irp + 7);
  _InterlockedExchange64((volatile __int64 *)Irp + 13, 0i64);
  KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)Irp + 69));
  v6 = 0;
  if( !CallerAcquiredMutex )
    ExAcquireFastMutex(v5->FastMutex);
  p_IrpOplocksRH = &v5->IrpOplocksRH;
  for( i = v5->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((INT64)Flink, (INT64)v5, 3221225760i64, 0i64, v11, v12, 0);
      }
      else
      {
        LODWORD(v13) = 0;
        LODWORD(v12) = 0;
        LODWORD(v11) = 0;
        FsRtlpRemoveAndBreakRHIrp(Flink, v5, 1u, 3221225760i64, v11, v12, v13, 0);
      }
      v6 = 1;
    }
  }
  if( v6 )
  {
    if( ReleaseWaitingIrps )
      FsRtlpReleaseIrpsWaitingForRH((INT64)v5);
    if( p_IrpOplocksRH->Flink == p_IrpOplocksRH )
      FsRtlpComputeShareableOplockState(v5);
  }
  if( !CallerAcquiredMutex )
    KeReleaseGuardedMutex(v5->FastMutex);
}

Referenced by:

FsRtlpOplockRHIrpCancelRoutine
FsRtlpRequestShareableOplock