PopRequestCompletion
NTSTATUS __stdcall PopRequestCompletion(_DEVICE_OBJECT *DeviceObject, _IRP *Irp, VOID *Context){
INT64 v3;
char v5;
_IRP *v6;
char v7;
void(__fastcall *v8)(_QWORD, _IRP *, _QWORD, _QWORD, _IO_STATUS_BLOCK *);
INT64 v9;
int Status;
__int64 v12;
__int64 v13;
v3 = *((_QWORD *)Context + 25);
v5 = *((_BYTE *)Context + 209);
v6 = Irp;
v7 = *((_BYTE *)Context + 184);
if( v3 && v7 == 2 )
PopFxNotifyPreDIrpCompletion(v3, (INT64)Irp, (unsigned int)Irp->IoStatus.Status);
v8 = (void(__fastcall *)(_QWORD, _IRP *, _QWORD, _QWORD, _IO_STATUS_BLOCK *))*((_QWORD *)Context + 27);
if( v8 )
{
LOBYTE(Irp) = v7;
v8(*((_QWORD *)Context + 29), Irp, *((unsigned int *)Context + 48), *((_QWORD *)Context + 28), &v6->IoStatus);
}
if( v7 )
{
PopDequeueQuerySetIrp(v6);
if( v3 && *((_BYTE *)Context + 184) == 2 && *((_DWORD *)Context + 47) == 1 && v5 )
{
if( *((_DWORD *)Context + 48) == 1 )
{
_m_prefetchw((const void *)(v3 + 32));
if( (_InterlockedAnd((volatile signed __int32 *)(v3 + 32), 0xFFFFFFFD) & 2) != 0 )
{
LABEL_16:
LOBYTE(v9) = 1;
PopPepDeviceDState(
*(PEPHANDLE__ **)(v3 + 56),
*((_DEVICE_POWER_STATE *)Context + 48),
v9,
*((unsigned int *)Context + 62));
PopDiagTraceFxDevicePowerState(*(VOID **)(v3 + 48), *((_DEVICE_POWER_STATE *)Context + 48));
goto LABEL_6;
}
v5 = 0;
}
if( v5 )
goto LABEL_16;
}
}
else
{
PopDiagTraceIrpFinish(v6);
Status = v6->IoStatus.Status;
if( Status >= 0 )
{
if( *((_BYTE *)Context + 240) )
{
PopUpdateWakeSource(*((_DEVICE_OBJECT **)Context + 3));
Status = v6->IoStatus.Status;
}
if( Status >= 0 )
{
v12 = *((_QWORD *)Context + 3);
v13 = v12 ? *(_QWORD *)(*(_QWORD *)(v12 + 312) + 40i64) : 0i64;
if( v13 && (*(_DWORD *)(v13 + 760) & 0x30000) != 0 )
PopDirectedDripsStartDisengageTimer(0i64);
}
}
if( v3 )
{
PopPepDeviceWaitWake(*(PEPHANDLE **)(v3 + 56), 1u);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v3 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v3 + 248), 0, 0);
}
}
LABEL_6:
PopFreeIrp(v6);
return -1073741802;
}Referenced by:
No references.