FsRtlpOplockBreakToNone

__int64 __fastcall FsRtlpOplockBreakToNone(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        int a4,
        int a5,
        __int64 a6,
        __int64 a7,
        void (__fastcall *a8)(__int64, __int64),
        __int64 a9,
        __int64 a10,
        void (__fastcall *a11)(__int128 *),
        _BYTE *a12,
        _BYTE *a13){
  unsigned int v17; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  _WAITING_IRP *v21; 
  unsigned int v22; 
  LIST_ENTRY *i; 
  int v24; 
  int v25; 
  __int128 v27; 
  __int64 v28; 
  v27 = 0i64;
  v28 = 0i64;
  v17 = 0;
  if( !a1 )
    return v17;
  v18 = *(_DWORD *)(a1 + 144);
  if( v18 == 1 || (v18 & 0x6000) != 0 )
    return v17;
  if( (v18 & 0x1F00F90) == 0 )
  {
    v19 = *(_QWORD *)a1;
    if( (v18 & 0x1000) != 0 )
      return v17;
    if( (a4 & 0x10010000) != 0 )
      return(unsigned int)-1073739511;
    *(_BYTE *)(v19 + 69) = KeAcquireQueuedSpinLock(7ui64);
    _InterlockedExchange64((volatile __int64 *)(v19 + 104), 0i64);
    KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v19 + 69));
    if( *(_BYTE *)(v19 + 68) )
    {
      *(_QWORD *)(v19 + 56) = 8i64;
      FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 0);
      FsRtlpClearOwner(a1, 0i64);
      *(_BYTE *)(a1 + 32) = 0;
      v20 = *(_QWORD *)a1;
      if( *(_QWORD *)(*(_QWORD *)a1 + 56i64) == a1 )
      {
        *(_QWORD *)(v20 + 56) = 0i64;
        v20 = *(_QWORD *)a1;
      }
      *(_DWORD *)(v20 + 48) = -1073741536;
      IofCompleteRequest(*(_IRP **)a1, 1);
      *(_QWORD *)a1 = 0i64;
      ObfDereferenceObjectWithTag(*(PVOID *)(a1 + 8), 0x746C6644ui64);
      *(_QWORD *)(a1 + 8) = 0i64;
      *(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 1;
      while( 1 )
      {
        v21 = *(_WAITING_IRP **)(a1 + 88);
        if( v21 == (_WAITING_IRP *)(a1 + 88) )
          break;
        FsRtlpRemoveAndCompleteWaitingIrp(v21);
      }
      return v17;
    }
    *(_QWORD *)(*(_QWORD *)a1 + 56i64) = 8i64;
    *(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
    IofCompleteRequest(*(_IRP **)a1, 1);
    *(_QWORD *)a1 = 0i64;
    *(_DWORD *)(a1 + 144) |= 0x200u;
    goto LABEL_14;
  }
  if( (((v18 & 0x1F0FFDF) - 16) & 0xFFFFEFFF) != 0 )
  {
    if( (v18 & 0x100) != 0 )
    {
      if( (a4 & 0x10010000) != 0 )
        return(unsigned int)-1073739511;
      v22 = v18 & 0xFFFFFEFF;
      *(_DWORD *)(a1 + 144) = v22;
      *(_DWORD *)(a1 + 144) = v22 | 0x400;
      goto LABEL_14;
    }
    if( (v18 & 0x80u) == 0 )
    {
LABEL_14:
      if( (a4 & 8) == 0 && FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), *(_FILE_OBJECT **)(a1 + 8), 0i64) )
        return v17;
      if( (a4 & 1) != 0 )
        return 264;
      if( (a4 & 0x10010000) == 0 )
      {
        FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 1u);
        FsRtlpOplockSendModernAppTermination((_NONOPAQUE_OPLOCK *)a1, 0i64);
        *a12 = 0;
        return(unsigned int)FsRtlpWaitOnIrp(a1, a3, a6, a7, a8, (char *)&v27, 0, a9, a10, a11, a13);
      }
      return(unsigned int)-1073739511;
    }
    if( (a4 & 0x10010000) != 0 )
      return(unsigned int)-1073739511;
    *(_DWORD *)(a1 + 144) = v18 & 0x20 | 1;
    *(_QWORD *)(a1 + 8) = 0i64;
    if( *(_QWORD *)(a1 + 24) )
    {
      FsRtlpClearOwner(a1, 0i64);
      *(_BYTE *)(a1 + 32) = 0;
    }
  }
  else
  {
    if( (a4 & 0x10010000) != 0 )
      return(unsigned int)-1073739511;
    for( i = *(LIST_ENTRY **)(a1 + 40); i != (LIST_ENTRY *)(a1 + 40); i = i->Flink )
    {
      if( LODWORD(i[1].Flink[1].Blink) != 590400 )
      {
        i = i->Blink;
        FsRtlpRemoveAndCompleteReadOnlyIrp(i->Flink, 0i64, 0i64);
      }
    }
    v24 = *(_DWORD *)(a1 + 144) & 0x20;
    if( (*(_DWORD *)(a1 + 144) & 0x1F0FFDF) == 4112 )
      v25 = v24 | 0x1000;
    else
      v25 = v24 | 1;
    *(_DWORD *)(a1 + 144) = v25;
  }
  return v17;
}

Referenced by:

FsRtlCheckOplockEx2
FsRtlCheckUpperOplock
FsRtlOplockBreakToNoneEx