FsRtlpOplockBreakToII

__int64 __fastcall FsRtlpOplockBreakToII(
        _NONOPAQUE_OPLOCK *Oplock,
        __int64 a2,
        __int64 a3,
        int a4,
        int a5,
        __int64 a6,
        __int64 a7,
        __int64 a8,
        __int64 a9,
        __int64 a10,
        __int64 a11,
        __int64 a12,
        __int64 a13){
  unsigned int OplockState; 
  unsigned int v17; 
  char v18; 
  unsigned int v19; 
  _IRP *IrpExclusiveOplock; 
  unsigned __int64 v21; 
  _CCHAR v22; 
  _CCHAR v23; 
  _IRP *v24; 
  _LIST_ENTRY *Flink; 
  unsigned int v26; 
  int v27; 
  __int128 v29; 
  __int64 v30; 

  v29 = 0i64;
  v30 = 0i64;
  OplockState = Oplock->OplockState;
  if( (OplockState & 0x40) == 0 || (OplockState & 0x7000) != 0 )
    return 0;
  if( (a4 & 8) != 0 )
  {
    v17 = 0;
  }
  else
  {
    FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), Oplock->FileObject, 0i64);
    v17 = 0;
    if( v18 )
      return v17;
  }
  if( (a4 & 0x10010000) != 0 )
    return(unsigned int)-1073739511;
  v19 = Oplock->OplockState;
  if( (v19 & 0x1F00F80) != 0 )
  {
    if( (v19 & 0x80u) != 0 )
    {
      Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
      Oplock->FileObject = 0i64;
      return v17;
    }
    goto LABEL_20;
  }
  IrpExclusiveOplock = Oplock->IrpExclusiveOplock;
  v21 = 7i64;
  IrpExclusiveOplock->CancelIrql = KeAcquireQueuedSpinLock(7i64, a2, a3);
  _InterlockedExchange64((volatile __int64 *)&IrpExclusiveOplock->CancelRoutine, 0i64);
  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, IrpExclusiveOplock->CancelIrql);
  if( !IrpExclusiveOplock->Cancel )
  {
    v26 = Oplock->OplockState;
    if( (v26 & 6) != 0 )
    {
      v27 = v26 | 0x100;
    }
    else
    {
      v27 = v26 | 0x200;
      v21 = 8i64;
    }
    Oplock->OplockState = v27;
    Oplock->IrpExclusiveOplock->IoStatus.Information = v21;
    Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
    LOBYTE(v22) = 1;
    IofCompleteRequest(Oplock->IrpExclusiveOplock, v22);
    Oplock->IrpExclusiveOplock = 0i64;
LABEL_20:
    if( (a4 & 1) != 0 )
    {
      return 264;
    }
    else
    {
      FsRtlpModifyThreadPriorities(Oplock, 0i64, 1u);
      FsRtlpOplockSendModernAppTermination(Oplock, 0i64);
      *(_BYTE *)a12 = 0;
      return(unsigned int)FsRtlpWaitOnIrp(
                             (__int64)Oplock,
                             a3,
                             (void *)a6,
                             (void(__fastcall *)(void *, _IRP *))a7,
                             (void(__fastcall *)(void *, __int64))a8,
                             (char *)&v29,
                             0,
                             a9,
                             a10,
                             (void(__fastcall *)(__int128 *))a11,
                             (_WAITING_IRP *)a13);
    }
  }
  IrpExclusiveOplock->IoStatus.Information = 8i64;
  FsRtlpModifyThreadPriorities(Oplock, 0i64, 0);
  FsRtlpClearOwner(Oplock, 0i64);
  Oplock->WaiterPriority = 0;
  v24 = Oplock->IrpExclusiveOplock;
  if( (_NONOPAQUE_OPLOCK *)Oplock->IrpExclusiveOplock->IoStatus.Information == Oplock )
  {
    v24->IoStatus.Information = 0i64;
    v24 = Oplock->IrpExclusiveOplock;
  }
  v24->IoStatus.Status = -1073741536;
  LOBYTE(v23) = 1;
  IofCompleteRequest(Oplock->IrpExclusiveOplock, v23);
  Oplock->IrpExclusiveOplock = 0i64;
  ObfDereferenceObjectWithTag(Oplock->FileObject, 0x746C6644ui64);
  Oplock->FileObject = 0i64;
  Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
  while( 1 )
  {
    Flink = Oplock->WaitingIrps.Flink;
    if( Flink == &Oplock->WaitingIrps )
      break;
    FsRtlpRemoveAndCompleteWaitingIrp((_WAITING_IRP *)Flink);
  }
  return v17;
}

Referenced by:

FsRtlCheckOplockEx2
FsRtlCheckUpperOplock