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