VfIoFreeIrp
NTSTATUS __stdcall VfIoFreeIrp(PVOID Irp, const VOID *CallerAddress){
_IOV_DATABASE_HEADER *v4;
_IOV_DATABASE_HEADER *v5;
_IOV_DATABASE_HEADER v7;
NTSTATUS v8;
bool v9;
UINT8 *v10;
UINT8 *v11;
UINT8 OldIrql;
UINT8 v13;
if( (*((_BYTE *)Irp + 71) & 0x21) != 33 )
{
v4 = VfIrpDatabaseEntryFindAndLock((_IRP *)Irp);
v5 = v4;
if( v4 )
{
if( *((PVOID *)Irp + 4) != (char *)Irp + 32 )
{
ViErrorReport1(524, (VOID *)CallerAddress, Irp);
VfIrpDatabaseEntryReleaseLock(v5);
return 1;
}
v7 = v4[14];
if( *((_QWORD *)v5 + 30) )
{
if( (v7 & 0x400000) == 0 )
ViErrorReport1(523, (VOID *)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(*((_EPROCESS **)v5 + 11), (unsigned int)v5[21]);
ObfDereferenceObjectWithTag(*((VOID **)v5 + 11), 0x49667256ui64);
}
v9 = v5[6]-- == 1;
v13 = 0;
if( v9 )
{
ViIrpDatabaseAcquireLockExclusive(&v13);
v11 = *(UINT8 **)v5;
(*((void(__fastcall **)(_IOV_DATABASE_HEADER *, _QWORD, __int64))v5 + 6))(v5, *(_QWORD *)v5, 1i64);
*(_QWORD *)v5 = 0i64;
VfUtilAddressRangeRemoveCheckEmpty(
(_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
+ 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v11 >> 12))),
v11);
ViIrpDatabaseReleaseLockExclusive(v13);
}
_InterlockedDecrement(v5 + 5);
VfIrpDatabaseEntryReleaseLock(v5);
ExFreePoolWithTag(Irp, 0);
return v8;
}
v9 = v5[6]-- == 1;
OldIrql = 0;
if( v9 )
{
ViIrpDatabaseAcquireLockExclusive(&OldIrql);
v10 = *(UINT8 **)v5;
(*((void(__fastcall **)(_IOV_DATABASE_HEADER *, _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);
ViIrpDatabaseReleaseLockExclusive(OldIrql);
}
_InterlockedDecrement(v5 + 5);
}
v8 = 0;
}
VfIrpDatabaseEntryReleaseLock(v5);
return v8;
}
}
return 0;
}Referenced by:
IovFreeIrpPrivate