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