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