PopFxIdleWorkerTail
VOID __stdcall PopFxIdleWorkerTail(POP_FX_DEVICE *FxDevice, UINT64 Component, PEP_WORK_INFORMATION *WorkInfo){
unsigned int v4;
__int64 v6;
UINT64 v7;
unsigned __int8 v8;
int v9;
unsigned __int64 v10;
char v11;
UINT8 v12;
signed __int32 v13;
signed __int32 v14;
unsigned int i;
unsigned __int64 v16;
int v17;
void(__fastcall *v18)(_QWORD, _QWORD);
v4 = Component;
v6 = *(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8i64 * (unsigned int)Component);
v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
v8 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v6 + 200));
v9 = *(_DWORD *)(v6 + 216);
v10 = v8;
if( v9 && v9 >= 0 )
{
PopFxUpdateAccountingActiveTime(v6 + 200, v7, 0i64);
*(_BYTE *)(v6 + 208) = v11;
}
KxReleaseSpinLock((UINT64 *)(v6 + 200));
__writecr8(v10);
PopDiagTraceFxComponentLogicalCondition(*((VOID **)FxDevice + 6), v4, 0);
PpmInterlockedUpdateTimeNoFence((UINT64 *)FxDevice + 63, v7, 0i64);
_m_prefetchw((const void *)(v6 + 88));
v13 = *(_DWORD *)(v6 + 88);
do
{
v14 = v13;
v13 = _InterlockedCompareExchange((volatile signed __int32 *)(v6 + 88), v13, v13);
}
while( v14 != v13 );
if( v13 == 0x40000000 )
{
if( PopPluginComponentActive(FxDevice, v4, v12, WorkInfo) == 1 )
PopFxProcessWork(0i64, WorkInfo);
for( i = 0; i < *(_DWORD *)(v6 + 172); ++i )
PoFxIdleComponent((ULONG_PTR)FxDevice, *(_DWORD *)(*(_QWORD *)(v6 + 176) + 8i64 * i), 2ui64);
if( _InterlockedCompareExchange((volatile signed __int32 *)(v6 + 88), 0, 0x40000000) != 0x40000000 )
{
_InterlockedIncrement((volatile signed __int32 *)(v6 + 88));
_InterlockedAnd((volatile signed __int32 *)(v6 + 88), 0xBFFFFFFF);
PopFxActivateComponentWorker(FxDevice, (POP_FX_COMPONENT *)v6, 0, 0i64);
}
}
else
{
PopFxAddRefDevice(FxDevice);
_InterlockedIncrement((volatile signed __int32 *)(v6 + 88));
_InterlockedAnd((volatile signed __int32 *)(v6 + 88), 0xBFFFFFFF);
v16 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)(v6 + 200));
v17 = *(_DWORD *)(v6 + 216);
if( v17 && v17 >= 0 )
{
*(_QWORD *)(v6 + 224) = v7;
*(_BYTE *)(v6 + 208) = 1;
}
KxReleaseSpinLock((UINT64 *)(v6 + 200));
__writecr8(v16);
PopDiagTraceFxComponentLogicalCondition(*((VOID **)FxDevice + 6), v4, 1u);
v18 = (void(__fastcall *)(_QWORD, _QWORD))*((_QWORD *)FxDevice + 14);
if( v18 )
v18(*((_QWORD *)FxDevice + 24), v4);
PopFxCompleteComponentActivation(FxDevice, (POP_FX_COMPONENT *)v6, 1u);
}
}Referenced by:
PoFxCompleteIdleCondition
PopFxIdleWorker