VfPendingMoreProcessingRequired
NTSTATUS __stdcall VfPendingMoreProcessingRequired(
_DEVICE_OBJECT *DeviceObject,
_IRP *Irp,
_IO_STACK_LOCATION *StackLocation,
INT64 *CompletionRoutine,
_DEVICE_OBJECT *a5,
_IRP *a6,
VOID *a7,
VOID *CompletionContext){
NTSTATUS v11;
_IOV_DATABASE_HEADER *v12;
_IOV_DATABASE_HEADER *v13;
int v14;
char v15;
bool v16;
UINT8 *v17;
_IRP *v19;
VOID *OldIrql[3];
v11 = 0;
v12 = VfIrpDatabaseEntryFindAndLock(Irp);
v13 = v12;
if( v12 )
{
if( StackLocation == *((_IO_STACK_LOCATION **)v12 + 27) )
{
v14 = v12[14];
if( v14 >= 0 )
{
v11 = 1;
v13[14] = v14 | 0x80000000;
}
}
VfIrpDatabaseEntryReleaseLock(v13);
if( v11 )
{
v11 = ViPendingDelayCompletion(
DeviceObject,
v13,
StackLocation,
CompletionRoutine,
a5,
v19,
OldIrql[0],
OldIrql[1]);
if( !v11 )
{
v15 = KeAcquireSpinLockRaiseToDpc((UINT64 *)v13 + 1);
v16 = v13[6]-- == 1;
*((_BYTE *)v13 + 16) = v15;
LOBYTE(OldIrql[0]) = 0;
if( v16 )
{
ViIrpDatabaseAcquireLockExclusive((UINT8 *)OldIrql);
v17 = *(UINT8 **)v13;
(*((void(__fastcall **)(_IOV_DATABASE_HEADER *, _QWORD, _QWORD))v13 + 6))(
v13,
*(_QWORD *)v13,
(unsigned int)(v11 + 1));
*(_QWORD *)v13 = 0i64;
VfUtilAddressRangeRemoveCheckEmpty(
(_VF_ADDRESS_RANGE *)(ViIrpDatabaseAddressRanges
+ 16i64 * (unsigned __int8)(-125 * ((unsigned __int64)v17 >> 12))),
v17);
ViIrpDatabaseReleaseLockExclusive((UINT8)OldIrql[0]);
}
_InterlockedDecrement(v13 + 5);
VfIrpDatabaseEntryReleaseLock(v13);
}
}
}
return v11;
}Referenced by:
IovpLocalCompletionRoutine