VfPendingMoreProcessingRequired
INT64 __fastcall VfPendingMoreProcessingRequired(INT64 a1, UINT64 Irp, INT64 a3, INT64 a4, INT64 a5){
unsigned int v8;
volatile signed __int32 *v9;
volatile signed __int32 *v10;
int v11;
UINT64 v12;
bool v13;
char v14;
UINT8 *v15;
UINT64 v16;
char OldIrql[24];
v8 = 0;
v9 = VfIrpDatabaseEntryFindAndLock(Irp);
v10 = v9;
if( v9 )
{
if( a3 == *((_QWORD *)v9 + 27) )
{
v11 = *((_DWORD *)v9 + 14);
if( v11 >= 0 )
{
v8 = 1;
*((_DWORD *)v10 + 14) = v11 | 0x80000000;
}
}
VfIrpDatabaseEntryReleaseLock(v10);
if( v8 )
{
v8 = ViPendingDelayCompletion(a1, (INT64)v10, a3, a4, a5);
if( !v8 )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)v10 + 1, v12);
v13 = (*((_DWORD *)v10 + 6))-- == 1;
*((_BYTE *)v10 + 16) = v14;
OldIrql[0] = 0;
if( v13 )
{
ViIrpDatabaseAcquireLockExclusive((UINT8 *)OldIrql);
v15 = *(UINT8 **)v10;
(*((void(__fastcall **)(volatile signed __int32 *, _QWORD, _QWORD))v10 + 6))(v10, *(_QWORD *)v10, v8 + 1);
*(_QWORD *)v10 = 0i64;
VfUtilAddressRangeRemoveCheckEmpty(
(_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
+ 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v15 >> 12))),
v15,
v16);
ViIrpDatabaseReleaseLockExclusive(OldIrql[0]);
}
_InterlockedDecrement(v10 + 5);
VfIrpDatabaseEntryReleaseLock(v10);
}
}
}
return v8;
}Referenced by:
IovpLocalCompletionRoutine