FsRtlpOplockBreakByCacheFlags

__int64 __fastcall FsRtlpOplockBreakByCacheFlags(
        _NONOPAQUE_OPLOCK *Oplock,
        __int64 a2,
        _IRP *a3,
        unsigned int a4,
        int a5,
        int a6,
        __int64 a7,
        __int64 a8,
        __int64 a9,
        __int64 a10,
        __int64 a11,
        __int64 a12,
        __int64 a13,
        __int64 a14){
  unsigned int v14; 
  __int64 v15; 
  char v17; 
  int v18; 
  unsigned int OplockState; 
  char v22; 
  unsigned int v23; 
  INT64 v24; 
  unsigned int v25; 
  unsigned int v26; 
  unsigned int v27; 
  bool v28; 
  _IRP *IrpExclusiveOplock; 
  _CCHAR v30; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v31; 
  _IRP *v32; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v33; 
  char v34; 
  int v35; 
  _LIST_ENTRY *v36; 
  char v37; 
  _LIST_ENTRY *i; 
  char v39; 
  _NONOPAQUE_OPLOCK *v40; 
  _EPROCESS *ExclusiveOplockOwner; 
  char v42; 
  _LIST_ENTRY **FileObject; 
  _LIST_ENTRY *p_IrpOplocksRH; 
  _LIST_ENTRY *v45; 
  _LIST_ENTRY *v46; 
  char v47; 
  INT64 v48; 
  INT64 v49; 
  int v50; 
  INT16 v51; 
  int v52; 
  int v53; 
  int v54; 
  UINT16 ShareMode; 
  _LIST_ENTRY *v56; 
  char v57; 
  _LIST_ENTRY *v58; 
  _LIST_ENTRY *v59; 
  _LIST_ENTRY *v60; 
  char v61; 
  char v62; 
  INT64 v63; 
  INT64 v64; 
  char v65; 
  _LIST_ENTRY *v66; 
  _LIST_ENTRY *v67; 
  char v68; 
  _IRP *v69; 
  _CCHAR v70; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v71; 
  _IRP *v72; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v73; 
  int v74; 
  _IRP *v75; 
  _CCHAR v76; 
  _CCHAR v77; 
  _IRP *v78; 
  _LIST_ENTRY *v79; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v80; 
  unsigned int v81; 
  _LIST_ENTRY *Flink; 
  char v83; 
  INT64 v84; 
  INT64 v85; 
  UINT64 AccessMode; 
  char v87; 
  char v88; 
  bool v89; 
  char v90; 
  __int128 v91; 
  __int64 v92; 
  __int64 v93; 
  unsigned int v96; 
  int v97; 

  v93 = a2;
  v14 = a4;
  v15 = a2;
  v96 = 0;
  v91 = 0i64;
  v92 = 0i64;
  v17 = 0;
  v87 = 0;
  v90 = 0;
  v89 = 0;
  v88 = 1;
  v18 = v14 & 8;
  if( a6 == 28672 || a6 == 20480 || a6 == 0x4000 || a6 == 0x2000 )
  {
    if( !Oplock )
      return v96;
    OplockState = Oplock->OplockState;
    if( OplockState != 1 && (OplockState & a6) != 0 )
    {
      if( (v14 & 8) != 0 )
      {
LABEL_14:
        v23 = Oplock->OplockState;
        v24 = v14 & 0x10010000;
        v97 = v14 & 0x10010000;
        if( (v23 & 0x40) != 0 && (_DWORD)v24 )
          return(unsigned int)-1073739511;
        v25 = v23 & 0x1F0FFDF;
        if( (v23 & 0x1F0FFDF) > 0x105040 )
        {
          if( v25 <= 0x803000 )
          {
            if( v25 == 8400896 )
            {
              if( (a6 & 0x3000) != 0 )
              {
                if( (_DWORD)v24 )
                  return(unsigned int)-1073739511;
                if( (a6 & 0x2000) != 0 )
                {
                  Flink = Oplock->RHBreakQueue.Flink;
                  while( Flink != &Oplock->RHBreakQueue )
                  {
                    if( v18 )
                      goto LABEL_151;
                    FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)Flink[1].Blink, 0i64);
                    if( !v83 )
                      goto LABEL_151;
                    Flink = Flink->Flink;
                    v15 = v93;
                  }
                }
              }
LABEL_152:
              if( v17 )
              {
                if( (a4 & 1) != 0 )
                {
                  v81 = Oplock->OplockState;
                  if( (v81 & 0x10000) != 0 )
                    Oplock->OplockState = v81 | 0x20000;
                  return 264;
                }
                else
                {
                  if( v88 )
                  {
                    FsRtlpModifyThreadPriorities(Oplock, 0i64, 1u);
                    FsRtlpOplockSendModernAppTermination(Oplock, 0i64);
                  }
                  *(_BYTE *)a13 = 0;
                  return(unsigned int)FsRtlpWaitOnIrp(
                                         (__int64)Oplock,
                                         (__int64)a3,
                                         (void *)a7,
                                         (void(__fastcall *)(void *, _IRP *))a8,
                                         (void(__fastcall *)(void *, __int64))a9,
                                         (char *)&v91,
                                         v89,
                                         a10,
                                         a11,
                                         (void(__fastcall *)(__int128 *))a12,
                                         (_WAITING_IRP *)a14);
                }
              }
              return v96;
            }
            if( v25 != 1077312 )
            {
              if( v25 == 3174464 )
              {
                if( a6 == 0x4000 )
                {
                  Oplock->OplockState = Oplock->OplockState & 0x20 | 0x107040;
                }
                else if( (a6 & 0x5000) == 20480 )
                {
                  Oplock->OplockState = Oplock->OplockState & 0x20 | 0x807040;
                }
                goto LABEL_151;
              }
              if( v25 != 5271616 )
                goto LABEL_180;
              if( a6 == 0x2000 )
              {
                Oplock->OplockState = Oplock->OplockState & 0x20 | 0x107040;
                goto LABEL_151;
              }
            }
            if( (a6 & 0x1000) != 0 )
              Oplock->OplockState = Oplock->OplockState & 0x20 | 0x807040;
            goto LABEL_151;
          }
          if( v25 != 8409152 )
          {
            if( v25 == 8417344 )
              goto LABEL_151;
            goto LABEL_180;
          }
        }
        else
        {
          if( v25 != 1069120 )
          {
            if( v25 <= 0x5040 )
            {
              if( v25 != 20544 )
              {
                v26 = v25 - 4096;
                if( v26 )
                {
                  v27 = v26 - 16;
                  if( v27 )
                  {
                    if( v27 == 8176 )
                      goto LABEL_64;
                    v28 = (v23 & 0x1000000) == 0;
LABEL_150:
                    if( v28 )
                      goto LABEL_152;
                    goto LABEL_151;
                  }
                }
                goto LABEL_51;
              }
              if( (a6 & 0x5000) == 20480 )
              {
                IrpExclusiveOplock = Oplock->IrpExclusiveOplock;
                IrpExclusiveOplock->CancelIrql = KeAcquireQueuedSpinLock(7i64, v24, (INT64)a3);
                _InterlockedExchange64((volatile __int64 *)&IrpExclusiveOplock->CancelRoutine, 0i64);
                KeReleaseQueuedSpinLock(LockQueueIoCancelLock, IrpExclusiveOplock->CancelIrql);
                if( !IrpExclusiveOplock->Cancel )
                {
                  v31.MasterIrp = (_IRP *)IrpExclusiveOplock->AssociatedIrp;
                  *(_OWORD *)&v31.MasterIrp->Type = 0i64;
                  *(_QWORD *)&v31.MasterIrp->Flags = 0i64;
                  *(_DWORD *)&v31.MasterIrp->Type = 1572865;
                  *(_DWORD *)&v31.MasterIrp->AllocationProcessorNumber = (Oplock->OplockState >> 12) & 7;
                  HIDWORD(v31.MasterIrp->MdlAddress) |= 1u;
                  IrpExclusiveOplock->IoStatus.Information = 24i64;
                  Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
                  LOBYTE(v30) = 1;
                  IofCompleteRequest(Oplock->IrpExclusiveOplock, v30);
                  Oplock->IrpExclusiveOplock = 0i64;
                  Oplock->OplockState = Oplock->OplockState & 0x20 | 0x805040;
LABEL_151:
                  v17 = 1;
                  goto LABEL_152;
                }
              }
              else
              {
                if( (a6 & 0x4000) == 0 )
                  goto LABEL_152;
                v32 = Oplock->IrpExclusiveOplock;
                v32->CancelIrql = KeAcquireQueuedSpinLock(7i64, v24, (INT64)a3);
                _InterlockedExchange64((volatile __int64 *)&v32->CancelRoutine, 0i64);
                KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v32->CancelIrql);
                if( !v32->Cancel )
                {
                  v33.MasterIrp = (_IRP *)v32->AssociatedIrp;
                  *(_OWORD *)&v33.MasterIrp->Type = 0i64;
                  *(_QWORD *)&v33.MasterIrp->Flags = 0i64;
                  *(_DWORD *)&v33.MasterIrp->Type = 1572865;
                  *(_DWORD *)&v33.MasterIrp->AllocationProcessorNumber = (Oplock->OplockState >> 12) & 7;
                  LODWORD(v33.MasterIrp->MdlAddress) = 1;
                  HIDWORD(v33.MasterIrp->MdlAddress) |= 1u;
                  v32->IoStatus.Information = 24i64;
                  Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
                  IofCompleteRequest(Oplock->IrpExclusiveOplock, 1);
                  Oplock->IrpExclusiveOplock = 0i64;
                  Oplock->OplockState = Oplock->OplockState & 0x20 | 0x105040;
                  v17 = 1;
                  goto LABEL_152;
                }
              }
              goto LABEL_140;
            }
            switch( v25 )
            {
              case 0x7040u:
                if( a6 == 0x4000 )
                {
                  v69 = Oplock->IrpExclusiveOplock;
                  v69->CancelIrql = KeAcquireQueuedSpinLock(7i64, v24, (INT64)a3);
                  _InterlockedExchange64((volatile __int64 *)&v69->CancelRoutine, 0i64);
                  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v69->CancelIrql);
                  if( !v69->Cancel )
                  {
                    v71.MasterIrp = (_IRP *)v69->AssociatedIrp;
                    *(_OWORD *)&v71.MasterIrp->Type = 0i64;
                    *(_QWORD *)&v71.MasterIrp->Flags = 0i64;
                    *(_DWORD *)&v71.MasterIrp->Type = 1572865;
                    *(_DWORD *)&v71.MasterIrp->AllocationProcessorNumber = (Oplock->OplockState >> 12) & 7;
                    LODWORD(v71.MasterIrp->MdlAddress) = 3;
                    HIDWORD(v71.MasterIrp->MdlAddress) |= 1u;
                    v69->IoStatus.Information = 24i64;
                    Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
                    LOBYTE(v70) = 1;
                    IofCompleteRequest(Oplock->IrpExclusiveOplock, v70);
                    Oplock->IrpExclusiveOplock = 0i64;
                    Oplock->OplockState = Oplock->OplockState & 0x20 | 0x507040;
                    goto LABEL_151;
                  }
                }
                else if( a6 == 0x2000 )
                {
                  v72 = Oplock->IrpExclusiveOplock;
                  v72->CancelIrql = KeAcquireQueuedSpinLock(7i64, v24, (INT64)a3);
                  _InterlockedExchange64((volatile __int64 *)&v72->CancelRoutine, 0i64);
                  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v72->CancelIrql);
                  if( !v72->Cancel )
                  {
                    v73.MasterIrp = (_IRP *)v72->AssociatedIrp;
                    *(_OWORD *)&v73.MasterIrp->Type = 0i64;
                    *(_QWORD *)&v73.MasterIrp->Flags = 0i64;
                    *(_DWORD *)&v73.MasterIrp->Type = 1572865;
                    *(_DWORD *)&v73.MasterIrp->AllocationProcessorNumber = (Oplock->OplockState >> 12) & 7;
                    LODWORD(v73.MasterIrp->MdlAddress) = 5;
                    v74 = HIDWORD(v73.MasterIrp->MdlAddress) | 1;
                    HIDWORD(v73.MasterIrp->MdlAddress) = v74;
                    if( !*(_BYTE *)v93 )
                    {
                      HIDWORD(v73.MasterIrp->MdlAddress) = v74 | 2;
                      v73.MasterIrp->Flags = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v93 + 8) + 8i64) + 20i64);
                      *((_WORD *)&v73.MasterIrp->Flags + 2) = *(_WORD *)(v93 + 26);
                    }
                    v72->IoStatus.Information = 24i64;
                    Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
                    LOBYTE(v73.MasterIrp) = 1;
                    IofCompleteRequest(Oplock->IrpExclusiveOplock, v73.IrpCount);
                    Oplock->IrpExclusiveOplock = 0i64;
                    Oplock->OplockState = Oplock->OplockState & 0x20 | 0x307040;
                    goto LABEL_151;
                  }
                }
                else
                {
                  if( (a6 & 0x5000) != 20480 )
                    goto LABEL_152;
                  v75 = Oplock->IrpExclusiveOplock;
                  v75->CancelIrql = KeAcquireQueuedSpinLock(7i64, v24, (INT64)a3);
                  _InterlockedExchange64((volatile __int64 *)&v75->CancelRoutine, 0i64);
                  KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v75->CancelIrql);
                  if( !v75->Cancel )
                  {
                    v80.MasterIrp = (_IRP *)v75->AssociatedIrp;
                    *(_OWORD *)&v80.MasterIrp->Type = 0i64;
                    *(_QWORD *)&v80.MasterIrp->Flags = 0i64;
                    *(_DWORD *)&v80.MasterIrp->Type = 1572865;
                    *(_DWORD *)&v80.MasterIrp->AllocationProcessorNumber = (Oplock->OplockState >> 12) & 7;
                    HIDWORD(v80.MasterIrp->MdlAddress) |= 1u;
                    v75->IoStatus.Information = 24i64;
                    Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
                    LOBYTE(v76) = 1;
                    IofCompleteRequest(Oplock->IrpExclusiveOplock, v76);
                    Oplock->IrpExclusiveOplock = 0i64;
                    Oplock->OplockState = Oplock->OplockState & 0x20 | 0x807040;
                    goto LABEL_151;
                  }
                }
LABEL_140:
                FsRtlpModifyThreadPriorities(Oplock, 0i64, 0);
                FsRtlpClearOwner(Oplock, 0i64);
                Oplock->WaiterPriority = 0;
                v78 = Oplock->IrpExclusiveOplock;
                if( (_NONOPAQUE_OPLOCK *)Oplock->IrpExclusiveOplock->IoStatus.Information == Oplock )
                {
                  v78->IoStatus.Information = 0i64;
                  v78 = Oplock->IrpExclusiveOplock;
                }
                v78->IoStatus.Status = -1073741536;
                LOBYTE(v77) = 1;
                IofCompleteRequest(Oplock->IrpExclusiveOplock, v77);
                Oplock->IrpExclusiveOplock = 0i64;
                ObfDereferenceObjectWithTag(Oplock->FileObject, 0x746C6644ui64);
                Oplock->FileObject = 0i64;
                Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
                while( 1 )
                {
                  v79 = Oplock->WaitingIrps.Flink;
                  if( v79 == &Oplock->WaitingIrps )
                    break;
                  FsRtlpRemoveAndCompleteWaitingIrp((_WAITING_IRP *)v79);
                }
                v89 = 0;
                v88 = 1;
                goto LABEL_152;
              case 0xB000u:
LABEL_51:
                if( (a6 & 0x1000) == 0 )
                  goto LABEL_63;
                v40 = (_NONOPAQUE_OPLOCK *)Oplock->IrpOplocksR.Flink;
                while( v40 != (_NONOPAQUE_OPLOCK *)&Oplock->IrpOplocksR )
                {
                  ExclusiveOplockOwner = v40->ExclusiveOplockOwner;
                  if( LODWORD(ExclusiveOplockOwner->Pcb.ProfileListHead.Flink) == 590400 )
                  {
                    if( v18 )
                      goto LABEL_59;
                    FsRtlpOplockKeysEqual(
                      *(_FILE_OBJECT **)(v15 + 48),
                      (_FILE_OBJECT *)ExclusiveOplockOwner->Pcb.ThreadListHead.Flink,
                      v14);
                    if( v42 )
                    {
                      v14 = a4;
                      v40 = (_NONOPAQUE_OPLOCK *)v40->IrpExclusiveOplock;
                      v15 = v93;
                    }
                    else
                    {
                      v14 = a4;
LABEL_59:
                      if( (v14 & 0x10010000) != 0 )
                        return(unsigned int)-1073739511;
                      FileObject = (_LIST_ENTRY **)v40->FileObject;
                      FsRtlpRemoveAndCompleteReadOnlyIrp(*FileObject, 0i64, 0i64);
                      v14 = a4;
                      v40 = (_NONOPAQUE_OPLOCK *)*FileObject;
                      v15 = v93;
                    }
                  }
                  else
                  {
                    v40 = (_NONOPAQUE_OPLOCK *)v40->IrpExclusiveOplock;
                    v15 = v93;
                  }
                }
                LODWORD(v24) = v97;
LABEL_63:
                if( (Oplock->OplockState & 0x1F0FFDF) == 45056 )
                {
LABEL_64:
                  if( a6 == 0x2000 )
                  {
                    p_IrpOplocksRH = &Oplock->IrpOplocksRH;
                    v45 = Oplock->IrpOplocksRH.Flink;
                    while( 1 )
                    {
                      while( 1 )
                      {
                        if( v45 == p_IrpOplocksRH )
                          goto LABEL_119;
                        v46 = v45[1].Flink;
                        if( !v18 )
                        {
                          FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v45[1].Blink, 0i64);
                          if( v47 )
                            goto LABEL_85;
                          LODWORD(v24) = v97;
                        }
                        if( (_DWORD)v24 )
                          return(unsigned int)-1073739511;
                        if( !v45[3].Blink )
                          break;
                        v17 = 1;
                        v87 = 1;
                        v45 = v45->Flink;
                        v15 = v93;
                        p_IrpOplocksRH = &Oplock->IrpOplocksRH;
                      }
                      v45 = v45->Blink;
                      if( Feature_Servicing_39887415__private_IsEnabled() )
                      {
                        v50 = 1;
                        v51 = 0;
                        v52 = 0;
                        if( !*(_BYTE *)v93 )
                        {
                          v50 = 3;
                          v52 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v93 + 8) + 8i64) + 20i64);
                          v51 = *(_WORD *)(v93 + 26);
                        }
                        LODWORD(v85) = v52;
                        LODWORD(v84) = v50;
                        if( !FsRtlpRemoveAndCompleteRHIrp(v45->Flink, Oplock, 0i64, 0x1000ui64, v84, v85, v51) )
                        {
                          v90 = 1;
                          goto LABEL_85;
                        }
                        v88 = 0;
                      }
                      else
                      {
                        BYTE5(v46[4].Flink) = KeAcquireQueuedSpinLock(7i64, v48, v49);
                        _InterlockedExchange64((volatile __int64 *)&v46[6].Blink, 0i64);
                        KeReleaseQueuedSpinLock(LockQueueIoCancelLock, BYTE5(v46[4].Flink));
                        if( BYTE4(v46[4].Flink) )
                        {
                          LODWORD(AccessMode) = 0;
                          LODWORD(v85) = 0;
                          LODWORD(v84) = 0;
                          FsRtlpRemoveAndBreakRHIrp(v45->Flink, Oplock, 0, 3221225760i64, v84, v85, AccessMode, 0);
                          v90 = 1;
                          v17 = v87;
                          goto LABEL_85;
                        }
                        v53 = 1;
                        v54 = 0;
                        ShareMode = 0;
                        if( !*(_BYTE *)v93 )
                        {
                          v53 = 3;
                          v54 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v93 + 8) + 8i64) + 20i64);
                          ShareMode = *(_WORD *)(v93 + 26);
                        }
                        LODWORD(AccessMode) = v54;
                        LODWORD(v85) = v53;
                        LODWORD(v84) = 4096;
                        FsRtlpRemoveAndBreakRHIrp(v45->Flink, Oplock, 0, 0i64, v84, v85, AccessMode, ShareMode);
                        v88 = 0;
                      }
                      v17 = 1;
                      v87 = 1;
                      v89 = v18 != 0;
LABEL_85:
                      LODWORD(v24) = v97;
                      v45 = v45->Flink;
                      v15 = v93;
                      p_IrpOplocksRH = &Oplock->IrpOplocksRH;
                    }
                  }
                  if( (a6 & 0x5000) == 20480 )
                  {
                    v56 = Oplock->RHBreakQueue.Flink;
                    while( v56 != &Oplock->RHBreakQueue )
                    {
                      if( v18
                        || (FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v56[1].Blink, v14),
                            v14 = a4,
                            !v57) )
                      {
                        if( (v14 & 0x10010000) != 0 )
                          return(unsigned int)-1073739511;
                        LODWORD(v56[3].Flink) &= 0xFF0FFFFF;
                        LODWORD(v56[3].Flink) |= 0x800000u;
                        if( (a6 & 0x2000) != 0 )
                          v17 = 1;
                        v87 = v17;
                      }
                      v56 = v56->Flink;
                      v15 = v93;
                    }
                    v58 = &Oplock->IrpOplocksRH;
                    v59 = Oplock->IrpOplocksRH.Flink;
                    while( 1 )
                    {
                      while( 1 )
                      {
                        if( v59 == v58 )
                          goto LABEL_119;
                        v60 = v59[1].Flink;
                        if( !v18 )
                        {
                          FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v59[1].Blink, v14);
                          if( v61 )
                            goto LABEL_118;
                          v14 = a4;
                        }
                        if( (v14 & 0x10010000) != 0 )
                          return(unsigned int)-1073739511;
                        if( !v59[3].Blink )
                          break;
                        v62 = v17;
                        if( (a6 & 0x2000) != 0 )
                          v62 = 1;
                        v17 = v62;
                        v87 = v62;
                        v59 = v59->Flink;
                        v15 = v93;
                        v58 = &Oplock->IrpOplocksRH;
                      }
                      v59 = v59->Blink;
                      if( Feature_Servicing_39887415__private_IsEnabled() )
                      {
                        LODWORD(v85) = 0;
                        LODWORD(v84) = 1;
                        if( !FsRtlpRemoveAndCompleteRHIrp(v59->Flink, Oplock, 0i64, 0i64, v84, v85, 0) )
                        {
                          v90 = 1;
                          goto LABEL_118;
                        }
                        v88 = 0;
                        v65 = v17;
                        if( (a6 & 0x2000) != 0 )
                          v65 = 1;
                        v87 = v65;
                        v89 = v18 != 0;
                      }
                      else
                      {
                        BYTE5(v60[4].Flink) = KeAcquireQueuedSpinLock(7i64, v63, v64);
                        _InterlockedExchange64((volatile __int64 *)&v60[6].Blink, 0i64);
                        KeReleaseQueuedSpinLock(LockQueueIoCancelLock, BYTE5(v60[4].Flink));
                        v66 = v59->Flink;
                        LODWORD(AccessMode) = 0;
                        if( BYTE4(v60[4].Flink) )
                        {
                          LODWORD(v85) = 0;
                          LODWORD(v84) = 0;
                          FsRtlpRemoveAndBreakRHIrp(v66, Oplock, 0, 3221225760i64, v84, v85, AccessMode, 0);
                          v90 = 1;
                          v17 = v87;
                          goto LABEL_118;
                        }
                        LODWORD(v85) = 1;
                        LODWORD(v84) = 0;
                        FsRtlpRemoveAndBreakRHIrp(v66, Oplock, 0, 0i64, v84, v85, AccessMode, 0);
                        v88 = 0;
                        v65 = v87;
                        if( (a6 & 0x2000) != 0 )
                          v65 = 1;
                        v87 = v65;
                        v89 = v18 != 0;
                      }
                      v17 = v65;
LABEL_118:
                      v14 = a4;
                      v59 = v59->Flink;
                      v15 = v93;
                      v58 = &Oplock->IrpOplocksRH;
                    }
                  }
LABEL_119:
                  if( v90 )
                    FsRtlpReleaseIrpsWaitingForRH(Oplock);
                  if( !v17 )
                  {
                    v67 = Oplock->RHBreakQueue.Flink;
                    if( v67 != &Oplock->RHBreakQueue && (a6 & 0x2000) != 0 )
                    {
                      if( v18 )
                      {
LABEL_128:
                        v17 = 1;
                      }
                      else
                      {
                        while( v67 != &Oplock->RHBreakQueue )
                        {
                          FsRtlpOplockKeysEqual((_FILE_OBJECT *)v67[1].Blink, *(_FILE_OBJECT **)(v93 + 48), 0i64);
                          if( !v68 )
                            goto LABEL_128;
                          v67 = v67->Flink;
                        }
                      }
                    }
                  }
                }
                FsRtlpComputeShareableOplockState(Oplock);
                goto LABEL_152;
              case 0x103000u:
                v34 = 0;
                v35 = a6 & 0x1000;
                if( (a6 & 0x1000) != 0 )
                {
                  v36 = Oplock->RHBreakQueue.Flink;
                  while( v36 != &Oplock->RHBreakQueue )
                  {
                    if( v18
                      || (FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v36[1].Blink, v14),
                          v14 = a4,
                          !v37) )
                    {
                      v34 = 1;
                      if( (v14 & 0x10010000) != 0 )
                        return(unsigned int)-1073739511;
                      LODWORD(v36[3].Flink) &= 0xFF0FFFFF;
                      LODWORD(v36[3].Flink) |= 0x800000u;
                    }
                    v36 = v36->Flink;
                    v15 = v93;
                  }
                  FsRtlpComputeShareableOplockState(Oplock);
                  v35 = a6 & 0x1000;
                }
                if( (a6 & 0x2000) == 0 )
                  goto LABEL_152;
                if( !v34 )
                {
                  if( !v35 )
                  {
                    for( i = Oplock->RHBreakQueue.Flink; i != &Oplock->RHBreakQueue; i = i->Flink )
                    {
                      if( v18 )
                        goto LABEL_151;
                      FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v93 + 48), (_FILE_OBJECT *)i[1].Blink, 0i64);
                      if( !v39 )
                        goto LABEL_151;
                    }
                  }
                  goto LABEL_152;
                }
                goto LABEL_151;
            }
LABEL_180:
            v28 = (v23 & 0x1000000) == 0;
            goto LABEL_150;
          }
          if( (a6 & 0x1000) != 0 )
            Oplock->OplockState = Oplock->OplockState & 0x20 | 0x805040;
        }
        v28 = (a6 & 0x5000) == 0;
        goto LABEL_150;
      }
      FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), Oplock->FileObject, v14);
      if( !v22 )
      {
        v15 = v93;
        v14 = a4;
        goto LABEL_14;
      }
    }
    return 0;
  }
  if( a3 )
  {
    a3->IoStatus.Status = -1073741597;
    LOBYTE(a2) = 1;
    IofCompleteRequest(a3, a2);
  }
  return 3221225699i64;
}

Referenced by:

FsRtlCheckOplockEx2
FsRtlCheckUpperOplock
FsRtlOplockBreakH
FsRtlOplockBreakToNoneEx