PopFxProcessWork
void __fastcall PopFxProcessWork(ULONG_PTR BugCheckParameter2, int *a2, EVENT_DESCRIPTOR *a3){
UINT64 v5;
UINT64 v6;
void *v7;
char v8;
UINT64 *v9;
unsigned __int8 v10;
unsigned __int64 v11;
CHAR v12;
ULONG_PTR v13;
__int64 v14;
__int64 v15;
int v16;
unsigned __int8 v17;
unsigned __int64 v18;
void(__fastcall *v19)(_QWORD, _QWORD);
signed __int32 v20;
signed __int32 v21;
BOOLEAN v22;
CHAR v23;
__int64 v24;
__int64 v25;
__int64 v26;
int v27;
signed __int32 v28;
void *v29;
__int64 v30;
__int64 v31;
__int64 v32;
__int64 v33;
__int64 v34;
signed __int32 v35;
__int64 v36;
unsigned int v37;
__int64 v38;
unsigned __int8 v39;
unsigned __int64 v40;
__int64 v41;
NTSTATUS v42;
__int64 v43;
__int64 v44;
INT64 RemlockSize;
__int64 v46[4];
NTSTATUS v47;
int v48;
__int64 v49;
v49 = 0i64;
if( (unsigned int)*a2 > 8 )
PopFxBugCheck(0x603ui64, BugCheckParameter2, *a2, 0i64);
while( 1 )
{
v5 = *a2;
if( !(_DWORD)v5 )
{
v13 = *((_QWORD *)a2 + 1);
if( BugCheckParameter2 )
goto LABEL_92;
v14 = (unsigned int)a2[4];
if( (unsigned int)v14 >= *(_DWORD *)(v13 + 828) )
PopFxBugCheck(0x611ui64, 0i64, *((_QWORD *)a2 + 1), (unsigned int)a2[4]);
_mm_lfence();
v15 = *(_QWORD *)(*(_QWORD *)(v13 + 832) + 8 * v14);
if( *(_DWORD *)(v15 + 152) )
PopFxBugCheck(0x615ui64, 0i64, (unsigned int)a2[4], 0i64);
if( *(int *)(v15 + 88) < 0 )
PopFxBugCheck(0x615ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v13 + 832) + 8 * v14), 1ui64);
if( (*(_DWORD *)(v15 + 88) & 0x3FFFFFFF) == 0 )
PopFxBugCheck(0x615ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v13 + 832) + 8 * v14), 2ui64);
if( *(_DWORD *)(v15 + 140) )
PopFxBugCheck(0x615ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v13 + 832) + 8 * v14), 3ui64);
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v15 + 200), v5);
v16 = *(_DWORD *)(v15 + 216);
v18 = v17;
if( v16 && v16 >= 0 )
{
*(_QWORD *)(v15 + 224) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*(_BYTE *)(v15 + 208) = 1;
}
KxReleaseSpinLock((UINT64 *)(v15 + 200));
__writecr8(v18);
PopDiagTraceFxComponentLogicalCondition(*(PVOID *)(v13 + 48), (unsigned int)v14, 1u);
v19 = *(void(__fastcall **)(_QWORD, _QWORD))(v13 + 112);
if( v19 )
v19(*(_QWORD *)(v13 + 192), (unsigned int)v14);
PopPepProcessEvent(
*(_QWORD *)(v13 + 56),
(volatile INT64 *)(*(_QWORD *)(v13 + 56) + 200 * v14 + 184),
2i64,
3ui64,
RemlockSize,
0i64);
PopFxCompleteComponentActivation(v13, v15, 1);
v12 = 0;
goto LABEL_17;
}
if( (_DWORD)v5 != 1 )
break;
v24 = *((_QWORD *)a2 + 1);
if( BugCheckParameter2 )
LABEL_92:
PopFxBugCheck(0x603ui64, BugCheckParameter2, v5, 0i64);
v25 = (unsigned int)a2[4];
if( (unsigned int)v25 >= *(_DWORD *)(v24 + 828) )
PopFxBugCheck(0x611ui64, 0i64, *((_QWORD *)a2 + 1), (unsigned int)a2[4]);
_mm_lfence();
v26 = *(_QWORD *)(*(_QWORD *)(v24 + 832) + 8 * v25);
if( (unsigned int)a2[5] >= *(_DWORD *)(v26 + 156) )
PopFxBugCheck(0x616ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v24 + 832) + 8 * v25), 0i64);
v27 = a2[5];
if( v27 == *(_DWORD *)(v26 + 152) )
PopFxBugCheck(0x616ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v24 + 832) + 8 * v25), 1ui64);
if( v27 && *(_DWORD *)(v26 + 152) )
PopFxBugCheck(0x616ui64, 0i64, *(_QWORD *)(*(_QWORD *)(v24 + 832) + 8 * v25), 2ui64);
*(_DWORD *)(v26 + 152) = a2[5];
*(_DWORD *)(v26 + 140) = 2;
(*(void(__fastcall **)(_QWORD, _QWORD, _QWORD))(v24 + 128))(
*(_QWORD *)(v24 + 192),
(unsigned int)v25,
(unsigned int)a2[5]);
v28 = _InterlockedExchangeAdd((volatile signed __int32 *)(v26 + 140), 0xFFFFFFFF);
v29 = *(void **)(v24 + 48);
if( v28 == 1 )
{
PopDiagTraceFxComponentIdleState(v29, (unsigned int)v25, (unsigned int)a2[5]);
v12 = PopPluginComponentIdleState(v24, v25, v30, a2);
}
else
{
PopFxAddLogEntry((INT64)v29, v25, 14, 0i64);
v12 = 0;
}
LABEL_17:
if( !v12 )
return;
}
switch( (_DWORD)v5 )
{
case 2:
v6 = *((_QWORD *)a2 + 1);
if( BugCheckParameter2 )
goto LABEL_92;
v7 = *(void **)(v6 + 48);
v8 = *((_BYTE *)a2 + 16);
if( v7 )
PopDiagTraceFxDevicePowerRequirement(v7, 1u, *((_BYTE *)a2 + 16));
v9 = (UINT64 *)(v6 + 360);
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v6 + 360), v5);
v11 = v10;
if( v8 )
{
*(_DWORD *)(v6 + 36) = 2;
_m_prefetchw((const void *)(v6 + 32));
v20 = *(_DWORD *)(v6 + 32);
do
{
v21 = v20;
v20 = _InterlockedCompareExchange((volatile signed __int32 *)(v6 + 32), v20 & 0xFFFFFF7F, v20);
}
while( v21 != v20 );
if( (v20 & 0x80u) == 0 )
PopFxBugCheck(0x609ui64, 0i64, v6, 0i64);
_m_prefetchw((const void *)(v6 + 32));
if( (_InterlockedOr((volatile signed __int32 *)(v6 + 32), 0) & 4) != 0 )
{
_InterlockedAnd((volatile signed __int32 *)(v6 + 32), 0xFFFFFFFB);
*(_DWORD *)(v6 + 40) = 0;
v22 = KeCancelTimer((PKTIMER)(v6 + 368));
_InterlockedAdd((volatile signed __int32 *)(v6 + 36), 0xFFFFFFFF);
if( !v22 )
goto LABEL_15;
v23 = PopFxCompleteDevicePowerRequired(v6, (__int64)a2);
}
else
{
if( *(_DWORD *)(v6 + 40) )
goto LABEL_15;
v23 = PopFxDeliverDevicePowerRequired(v6, (__int64)a2);
}
v12 = v23;
}
else
{
_m_prefetchw((const void *)(v6 + 32));
if( (_InterlockedOr((volatile signed __int32 *)(v6 + 32), 0) & 0x80u) != 0 )
PopFxBugCheck(0x609ui64, 0i64, v6, 1ui64);
PopPluginDevicePower(v6, 0, 0i64);
_InterlockedOr((volatile signed __int32 *)(v6 + 32), 0x80u);
if( *(_QWORD *)(v6 + 144) )
{
if( *(_DWORD *)(v6 + 36) || *(_DWORD *)(v6 + 40) || (*(_DWORD *)(v6 + 32) & 4) != 0 )
PopFxBugCheck(0x610ui64, 0i64, v6, 0i64);
*(_DWORD *)(v6 + 40) = 2;
if( !PopFxScheduleDeviceIdleTimer(v6) )
{
PopDiagTraceFxDevicePowerRequirement(*(PVOID *)(v6 + 48), 0, 0);
(*(void(__fastcall **)(_QWORD))(v6 + 144))(*(_QWORD *)(v6 + 192));
_InterlockedOr((volatile signed __int32 *)(v6 + 32), 0x40u);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 40), 0xFFFFFFFF) != 1 )
PopFxAddLogEntry(*(_QWORD *)(v6 + 48), 0, 17, 0i64);
}
}
else
{
PopDiagTraceFxDevicePowerRequirement(*(PVOID *)(v6 + 48), 0, 0);
_InterlockedOr((volatile signed __int32 *)(v6 + 32), 0x40u);
}
LABEL_15:
v12 = 0;
}
KxReleaseSpinLock(v9);
__writecr8(v11);
goto LABEL_17;
case 3:
v41 = *((_QWORD *)a2 + 1);
v42 = -1073741822;
if( *(_QWORD *)(v41 + 152) )
{
v42 = IoAcquireRemoveLockEx((PIO_REMOVE_LOCK)(v41 + 240), 0i64, (PCSTR)File, 1u, 0x20u);
if( v42 >= 0 )
{
v42 = (*(__int64(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, __int64 *))(v41 + 152))(
*(_QWORD *)(v41 + 192),
*((_QWORD *)a2 + 2),
*((_QWORD *)a2 + 4),
*((_QWORD *)a2 + 5),
*((_QWORD *)a2 + 6),
*((_QWORD *)a2 + 7),
&v49);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v41 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v41 + 248), 0);
}
}
v43 = *(_QWORD *)(v41 + 56);
v48 = 0;
v47 = v42;
v44 = *(_QWORD *)(v43 + 32);
v46[0] = *(_QWORD *)(v44 + 72);
v46[1] = *((_QWORD *)a2 + 2);
v46[2] = *((_QWORD *)a2 + 3);
v46[3] = v49;
(*(void(__fastcall **)(__int64, __int64 *))(*(_QWORD *)(v44 + 64) + 96i64))(15i64, v46);
break;
case 4:
v38 = *((_QWORD *)a2 + 1);
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v38 + 360), v5);
v40 = v39;
if( *((_BYTE *)a2 + 16) )
_InterlockedOr((volatile signed __int32 *)(v38 + 32), 8u);
else
_InterlockedAnd((volatile signed __int32 *)(v38 + 32), 0xFFFFFFF7);
PopFxUpdateDeviceIdleTimer(v38);
KxReleaseSpinLock((UINT64 *)(v38 + 360));
__writecr8(v40);
return;
default:
if( (_DWORD)v5 != 5 )
{
if( (_DWORD)v5 != 6 )
{
if( (_DWORD)v5 == 7 )
{
PopFxAcpiForwardPepAcpiNotifyRequest(*((_QWORD *)a2 + 1), a2);
}
else if( (_DWORD)v5 == 8 )
{
PopFxAcpiForwardPepWorkRequest(*((_QWORD *)a2 + 1), a2);
}
return;
}
v31 = *((_QWORD *)a2 + 1);
if( BugCheckParameter2 )
{
v32 = (unsigned int)a2[4];
if( (unsigned int)v32 >= *(_DWORD *)(v31 + 828) )
PopFxBugCheck(0x611ui64, BugCheckParameter2, *((_QWORD *)a2 + 1), (unsigned int)a2[4]);
_mm_lfence();
v33 = *(_QWORD *)(*(_QWORD *)(v31 + 832) + 8 * v32);
v34 = *(_QWORD *)(v33 + 424);
v35 = _InterlockedDecrement((volatile signed __int32 *)(v34 + 40));
_InterlockedOr((volatile signed __int32 *)(v34 + 40), 0x20000000u);
if( (v35 & 0x8000000) == 0 )
PopFxAddLogEntry(*(_QWORD *)(v31 + 48), v32, 20, 1i64);
PopDiagTraceFxPerfRequestProgress((__int64 *)v34, v35 & 7, a3);
PopFxCompleteComponentPerfState(v31, *(_DWORD *)(v33 + 16), *(_QWORD *)(v33 + 424), *((_BYTE *)a2 + 20));
return;
}
LABEL_73:
PopFxBugCheck(0x603ui64, 0i64, v5, 0i64);
}
v36 = *((_QWORD *)a2 + 1);
if( !BugCheckParameter2 )
goto LABEL_73;
v37 = a2[4];
if( v37 >= *(_DWORD *)(v36 + 828) )
PopFxBugCheck(0x611ui64, BugCheckParameter2, *((_QWORD *)a2 + 1), (unsigned int)a2[4]);
PopFxAddLogEntry(*(_QWORD *)(v36 + 48), v37, 18, 1i64);
PopPepCompleteComponentIdleState(*(PEPHANDLE__ **)(v36 + 56), v37);
break;
}
}Referenced by:
PoFxCompleteIdleState
PopFxActivateComponentWorker
PopFxDispatchPluginWorkOnce
PopFxIdleWorkerTail