VfIrpDatabaseEntryReleaseLock

__int64 __fastcall VfIrpDatabaseEntryReleaseLock(_QWORD *a1){
  bool v1; 
  UINT8 *v3; 
  UINT64 v4; 
  _QWORD *v5; 
  __int64 v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  unsigned __int64 v9; 
  _QWORD *v10; 
  __int64 result; 
  UINT8 OldIrql; 
  v1 = *((_DWORD *)a1 + 6) == 0;
  OldIrql = 0;
  if( v1 )
  {
    ViIrpDatabaseAcquireLockExclusive(&OldIrql);
    v3 = (UINT8 *)*a1;
    if( *a1 )
    {
      ((void(__fastcall *)(_QWORD *, _QWORD, __int64))a1[6])(a1, *a1, 1i64);
      *a1 = 0i64;
      VfUtilAddressRangeRemoveCheckEmpty(
        (_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges + 16i64
                                                         * (unsigned __int8)(-125 * ((unsigned __int64)v3 >> 12))),
        v3,
        v4);
    }
    ViIrpDatabaseReleaseLockExclusive(OldIrql);
  }
  if( !*((_DWORD *)a1 + 5) )
  {
    ViIrpDatabaseAcquireLockExclusive(&OldIrql);
    if( !*((_DWORD *)a1 + 5) )
    {
      v5 = a1 + 4;
      v6 = a1[4];
      v7 = (_QWORD *)a1[5];
      if( *(_QWORD **)(v6 + 8) != a1 + 4 || (_QWORD *)*v7 != v5 )
        __fastfail(3u);
      *v7 = v6;
      *(_QWORD *)(v6 + 8) = v7;
      a1[5] = a1 + 4;
      *v5 = v5;
      if( *(_QWORD *)v6 == v6 )
      {
        v8 = (_QWORD *)(ViIrpDatabaseAddressRanges + 16i64 * (unsigned int)((v6 - ViIrpDatabase) >> 4));
        *v8 = 0i64;
        v8[1] = 0i64;
      }
    }
    ViIrpDatabaseReleaseLockExclusive(OldIrql);
  }
  v9 = *((unsigned __int8 *)a1 + 16);
  v10 = (_QWORD *)a1[4];
  KxReleaseSpinLock(a1 + 1);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(v9);
  if( v10 == a1 + 4 )
  {
    *((_DWORD *)a1 + 7) |= 0x80000000;
    return((__int64(__fastcall *)(_QWORD *, _QWORD, __int64))a1[6])(a1, *a1, 2i64);
  }
  return result;
}

Referenced by:

IovAllocateIrp
IovCancelIrp
IovpCallDriver1
IovpCallDriver2
IovpCheckIrpForCriticalTracking
IovpCompleteRequest1
IovpCompleteRequest2
IovpCompleteRequest3
IovpCompleteRequest4
IovpLocalCompletionRoutine
VfIoAllocateIrp2
VfIoFreeIrp
VfIoInitializeIrp
VfIrpDatabaseEntryFindAndLock
VfIrpWatermark
VfPendingMoreProcessingRequired
VfSetIoBuildRequest
ViPendingCompleteAfterWait