VfIrpDatabaseEntryReleaseLock

VOID __stdcall VfIrpDatabaseEntryReleaseLock(_IOV_DATABASE_HEADER *IovHeader){
  bool v1; 
  UINT8 *v3; 
  _IOV_DATABASE_HEADER *v4; 
  __int64 v5; 
  _IOV_DATABASE_HEADER **v6; 
  _QWORD *v7; 
  unsigned __int64 v8; 
  _IOV_DATABASE_HEADER *v9; 
  UINT8 OldIrql; 

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

Referenced by:

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