VfIoFreeIrp

UINT64 __stdcall VfIoFreeIrp(IRP *Irp, PVOID CallerAddress){
  volatile signed __int32 *v4; 
  volatile signed __int32 *v5; 
  int v7; 
  unsigned int v8; 
  bool v9; 
  UINT8 *v10; 
  UINT64 v11; 
  UINT8 *v12; 
  UINT64 v13; 
  UINT8 OldIrql; 
  UINT8 v15; 
  if( (*((_BYTE *)Irp + 71) & 0x21) != 33 )
  {
    v4 = VfIrpDatabaseEntryFindAndLock((unsigned __int64)Irp);
    v5 = v4;
    if( v4 )
    {
      if( *((IRP **)Irp + 4) != (IRP *)((char *)Irp + 32) )
      {
        ViErrorReport1(524i64, CallerAddress, Irp);
        VfIrpDatabaseEntryReleaseLock(v5);
        return 1i64;
      }
      v7 = *((_DWORD *)v4 + 14);
      if( *((_QWORD *)v5 + 30) )
      {
        if( (v7 & 0x400000) == 0 )
          ViErrorReport1(523i64, CallerAddress, Irp);
        v8 = 1;
      }
      else
      {
        if( (v7 & 0x200000) != 0 )
        {
          if( (v7 & 8) != 0 )
          {
            v8 = 1;
            *(_WORD *)Irp = 0;
            if( (*((_BYTE *)Irp + 71) & 1) != 0 )
            {
              PsReturnProcessNonPagedPoolQuota(*((_QWORD *)v5 + 11), *((unsigned int *)v5 + 21));
              ObfDereferenceObjectWithTag(*((PVOID *)v5 + 11), 0x49667256ui64);
            }
            v9 = (*((_DWORD *)v5 + 6))-- == 1;
            v15 = 0;
            if( v9 )
            {
              ViIrpDatabaseAcquireLockExclusive(&v15);
              v12 = *(UINT8 **)v5;
              (*((void(__fastcall **)(volatile signed __int32 *, _QWORD, __int64))v5 + 6))(v5, *(_QWORD *)v5, 1i64);
              *(_QWORD *)v5 = 0i64;
              VfUtilAddressRangeRemoveCheckEmpty(
                (_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
                                    + 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v12 >> 12))),
                v12,
                v13);
              ViIrpDatabaseReleaseLockExclusive(v15);
            }
            _InterlockedDecrement(v5 + 5);
            VfIrpDatabaseEntryReleaseLock(v5);
            ExFreePoolWithTag(Irp, 0);
            return v8;
          }
          v9 = (*((_DWORD *)v5 + 6))-- == 1;
          OldIrql = 0;
          if( v9 )
          {
            ViIrpDatabaseAcquireLockExclusive(&OldIrql);
            v10 = *(UINT8 **)v5;
            (*((void(__fastcall **)(volatile signed __int32 *, _QWORD, __int64))v5 + 6))(v5, *(_QWORD *)v5, 1i64);
            *(_QWORD *)v5 = 0i64;
            VfUtilAddressRangeRemoveCheckEmpty(
              (_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
                                  + 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v10 >> 12))),
              v10,
              v11);
            ViIrpDatabaseReleaseLockExclusive(OldIrql);
          }
          _InterlockedDecrement(v5 + 5);
        }
        v8 = 0;
      }
      VfIrpDatabaseEntryReleaseLock(v5);
      return v8;
    }
  }
  return 0i64;
}

Referenced by:

IovFreeIrpPrivate