ViPendingDelayCompletion
NTSTATUS __stdcall ViPendingDelayCompletion(
_DEVICE_OBJECT *DeviceObject,
_IOV_REQUEST_PACKET *IovPacket,
_IO_STACK_LOCATION *StackLocation,
INT64 *CompletionRoutine,
_DEVICE_OBJECT *a5,
_IRP *a6,
VOID *a7,
VOID *CompletionContext){
NTSTATUS v12;
VOID **PoolWithTag;
VOID **v14;
_KTIMER *v15;
__int64 v16;
_ADAPTER_OBJECT *v17;
v12 = 1;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0xB0ui64, 1685090889i64);
v14 = PoolWithTag;
if( !PoolWithTag )
return 0;
v15 = (_KTIMER *)(PoolWithTag + 13);
KeInitializeTimerEx((INT64)(PoolWithTag + 13), 1);
IovPacket[14] |= 0x10u;
v14[4] = a5;
*v14 = IovPacket;
v14[1] = DeviceObject;
v14[3] = CompletionRoutine;
v14[2] = StackLocation;
*((_BYTE *)v14 + 172) = *((_BYTE *)IovPacket + 185);
v16 = *((_QWORD *)IovPacket + 27);
if( v16 && (v17 = *(_ADAPTER_OBJECT **)(v16 + 40)) != 0i64 )
ObfReferenceObject(v17);
else
v17 = 0i64;
if( KeGetCurrentIrql() >= 2u )
{
*((_DWORD *)v14 + 42) = 2;
KeInitializeDpc((PRKDPC)(v14 + 5), ViPendingCompleteAtDPC, v14);
KiSetTimerEx(v15, (_LARGE_INTEGER)-3000i64, 0i64, 0, (_KDPC *)(v14 + 5));
}
else
{
*((_DWORD *)v14 + 42) = 1;
KiSetTimerEx(v15, (_LARGE_INTEGER)-3000i64, 0i64, 0, 0i64);
v12 = ViPendingQueuePassiveLevelCompletion((_VF_PENDING_DEFERRAL_CONTEXT *)v14);
if( !v12 )
{
KeCancelTimer((INT64)v15);
ExFreePoolWithTag(v14, 0);
IovPacket[14] &= ~0x10u;
if( v17 )
HalPutDmaAdapter(v17);
}
}
return v12;
}Referenced by:
VfPendingMoreProcessingRequired