FsRtlpCancelReadOnlyOplockIrp

VOID __stdcall FsRtlpCancelReadOnlyOplockIrp(_IRP *Irp, UINT8 CallerAcquiredMutex){
  _NONOPAQUE_OPLOCK *Information; 
  char v4; 
  _LIST_ENTRY *i; 

  Information = (_NONOPAQUE_OPLOCK *)Irp->IoStatus.Information;
  _InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
  v4 = 0;
  if( !CallerAcquiredMutex )
    ExAcquireFastMutex(Information->FastMutex);
  for( i = Information->IrpOplocksR.Flink; i != &Information->IrpOplocksR; i = i->Flink )
  {
    if( BYTE4(i[-7].Blink) )
    {
      i = i->Blink;
      FsRtlpRemoveAndCompleteReadOnlyIrp(i->Flink, 3221225760i64, 0i64);
      v4 = 1;
    }
  }
  if( v4 )
    FsRtlpComputeShareableOplockState(Information);
  if( !CallerAcquiredMutex )
    KeReleaseGuardedMutex(Information->FastMutex);
}

Referenced by:

FsRtlpAcknowledgeOplockBreak
FsRtlpReadOnlyOplockIrpCancelRoutine
FsRtlpRequestShareableOplock