PopFxIssueComponentPerfStateChanges

VOID __stdcall PopFxIssueComponentPerfStateChanges(
        _POP_FX_DEVICE *FxDevice,
        _POP_FX_COMPONENT *FxComponent,
        UINT64 Flags,
        UINT64 PerfChangesCount,
        _PO_FX_PERF_STATE_CHANGE *PerfChanges,
        VOID *Context){
  unsigned int v6; 
  char v7; 
  __int64 v10; 
  int v11; 
  _PO_FX_PERF_STATE_CHANGE *v12; 
  char v13; 
  int v14; 
  char v15; 
  UINT8 v16; 
  _KQUEUE *v17; 
  UINT8 v18; 
  int v19[8]; 
  int v20; 
  UINT8 Succeeded; 

  v6 = PerfChangesCount;
  v7 = Flags;
  KeGetCurrentIrql();
  v10 = *((_QWORD *)FxComponent + 53);
  if( !v10 )
    PopFxBugCheck(0x61Bu, *((_QWORD *)FxDevice + 8), (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4));
  v11 = *(_DWORD *)(*(_QWORD *)v10 + 16i64);
  if( (unsigned int)PerfChangesCount > *(_DWORD *)(v10 + 144) )
    PopFxBugCheck(0x61Cu, (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4), 0);
  if( (_InterlockedExchange((volatile __int32 *)(v10 + 40), 0) & 7) != 0 )
    PopFxBugCheck(0x61Du, (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4), *(_QWORD *)(v10 + 80));
  v12 = PerfChanges;
  if( *(_BYTE *)(v10 + 74) )
  {
    memmove(*(VOID **)(v10 + 48), PerfChanges, 16 * PerfChangesCount);
    *(_DWORD *)(v10 + 56) = v6;
    *(_BYTE *)(v10 + 72) = 0;
    *(_QWORD *)(v10 + 64) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  }
  *(_QWORD *)(v10 + 80) = Context;
  KeResetEvent((_KEVENT *)(v10 + 8));
  PopDiagTraceFxPerfRequest((_POP_FX_PERF_INFO *)v10, v6, v12);
  v13 = 1;
  v20 = v7 & 1;
  if( (v7 & 1) != 0 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x88000000);
  }
  else if( (v7 & 2) != 0 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x10000000u);
  }
  _InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 4u);
  _InterlockedOr(v19, 0);
  if( *(_BYTE *)(v10 + 73) )
  {
    v14 = *((_DWORD *)FxComponent + 4);
    Succeeded = 0;
    v15 = PopPluginRequestComponentPerfState((__int64)FxDevice, v14, v6, (__int64)v12, (char *)&Succeeded);
    v16 = Succeeded;
    v13 = v15;
  }
  else
  {
    v16 = 1;
    Succeeded = 1;
  }
  if( v13 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), v16 != 0 ? 1610612736 : 0x20000000);
    _InterlockedDecrement((volatile signed __int32 *)(v10 + 40));
  }
  PopDiagTraceFxPerfRequestProgress(
    (_POP_FX_PERF_INFO *)v10,
    ((unsigned __int8)_InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 0xFFFFFFFF) - 1) & 7);
  if( v13 )
  {
    if( (v7 & 2) != 0 )
    {
      PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 15, 0i64);
      PopFxQueueWorkOrder(v17, (_POP_FX_WORK_ORDER *)(v10 + 88), FxDevice, v18);
    }
    else
    {
      _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x80000000);
      PopFxCompleteComponentPerfState(FxDevice, *((unsigned int *)FxComponent + 4), (_POP_FX_PERF_INFO *)v10, Succeeded);
    }
  }
  else if( v20 )
  {
    KeWaitForSingleObject(v10 + 8, 0, 0, 0, 0i64);
  }
  else
  {
    PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 15, 0i64);
    PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 20, 0i64);
  }
}

Referenced by:

PoFxIssueComponentPerfStateChangeMultiple