FsRtlpCancelReadOnlyOplockIrp

VOID __stdcall FsRtlpCancelReadOnlyOplockIrp(_IRP *Irp, UINT8 CallerAcquiredMutex){
  _NONOPAQUE_OPLOCK *v3; 
  char v4; 
  LIST_ENTRY *i; 
  v3 = (_NONOPAQUE_OPLOCK *)*((_QWORD *)Irp + 7);
  _InterlockedExchange64((volatile __int64 *)Irp + 13, 0i64);
  KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)Irp + 69));
  v4 = 0;
  if( !CallerAcquiredMutex )
    ExAcquireFastMutex(v3->FastMutex);
  for( i = v3->IrpOplocksR.Flink; i != &v3->IrpOplocksR; i = i->Flink )
  {
    if( BYTE4(i[-7].Blink) )
    {
      i = i->Blink;
      FsRtlpRemoveAndCompleteReadOnlyIrp(i->Flink, 3221225760i64, 0i64);
      v4 = 1;
    }
  }
  if( v4 )
    FsRtlpComputeShareableOplockState(v3);
  if( !CallerAcquiredMutex )
    KeReleaseGuardedMutex(v3->FastMutex);
}

Referenced by:

FsRtlpAcknowledgeOplockBreak
FsRtlpReadOnlyOplockIrpCancelRoutine
FsRtlpRequestShareableOplock