PpmPerfArbitratorApplyProcessorState

CHAR __stdcall PpmPerfArbitratorApplyProcessorState(INT64 a1, UINT8 a2, CHAR a3, INT64 a4){
  __int64 v4; 
  _KPRCB *v5; 
  __int64 v6; 
  CHAR v8; 
  __int64 v10; 
  CHAR v12; 
  char v13; 
  signed int v14; 
  int v15; 
  _DWORD *v16; 
  _MI_SYSTEM_VA_TYPE v17; 
  int v19; 
  unsigned __int16 v20; 
  unsigned int v21; 
  __int64 v22; 
  unsigned __int64 v23; 

  v4 = *(_QWORD *)(a1 + 33136);
  v5 = (_KPRCB *)(a1 + 33128);
  v6 = *(_QWORD *)(a1 + 33128);
  v8 = a3;
  v10 = 0i64;
  v12 = 1;
  v13 = 0;
  if( PpmPerfQosEnabled )
    v14 = *(_DWORD *)(a1 + 33264);
  else
    v14 = 0;
  v15 = *(_DWORD *)(v6 + 548);
  if( v14 != *(_DWORD *)(a1 + 33268) )
  {
    if( !*(_BYTE *)(v6 + 355) || (struct _KPRCB *)a1 == KeGetCurrentPrcb() )
    {
      v19 = *(unsigned __int16 *)(a1 + 33272);
      v16 = (_DWORD *)(v4 + 104);
      if( !_bittest(&v19, v14) || *v16 != v15 )
      {
        *v16 = v15;
        v8 = 1;
        a2 = 1;
      }
      *(_DWORD *)(a1 + 33268) = v14;
      v13 = 1;
      goto LABEL_7;
    }
    return 0;
  }
  v16 = (_DWORD *)(v4 + 104);
  if( *(_DWORD *)(v4 + 104) != v15 )
  {
    if( !v14 )
    {
LABEL_6:
      *v16 = v15;
      v8 = 1;
      goto LABEL_7;
    }
    if( !*(_BYTE *)(v6 + 355) || (struct _KPRCB *)a1 == KeGetCurrentPrcb() )
    {
      a2 = 1;
      goto LABEL_6;
    }
    return 0;
  }
LABEL_7:
  if( v8 )
  {
    if( a3 )
      *v16 = 0;
    LOBYTE(a4) = a3;
    *(_DWORD *)(v4 + 112) = *(_DWORD *)(v4 + 72);
    LOBYTE(v10) = a2;
    *(_DWORD *)(v4 + 108) = *(_DWORD *)(v4 + 76);
    *(_OWORD *)(v4 + 64) = *(_OWORD *)(v6 + 40i64 * v14 + 552);
    *(_OWORD *)(v4 + 80) = *(_OWORD *)(v6 + 40i64 * v14 + 568);
    *(_QWORD *)(v4 + 96) = *(_QWORD *)(v6 + 40i64 * v14 + 584);
    (*(void(__fastcall **)(_QWORD, __int64, __int64, INT64))(v6 + 288))(*(_QWORD *)(v4 + 8), v4 + 64, v10, a4);
    if( PopHeteroSystem )
    {
      v20 = *(_WORD *)(v6 + 2i64 * v14 + 536);
      v17 = *(unsigned __int16 *)(a1 + 33272);
      if( v20 != (_WORD)v17 )
      {
        *(_WORD *)(a1 + 33272) = v20;
        v21 = 0;
        v22 = *(_QWORD *)(a1 + 192);
        do
        {
          if( (v20 & 1) != (v17 & 1) )
          {
            v23 = *(unsigned __int8 *)(a1 + 209);
            if( (v20 & 1) != 0 )
              _interlockedbittestandset64((volatile signed __int32 *)(v22 + 8i64 * v21 + 304), v23);
            else
              _interlockedbittestandreset64((volatile signed __int32 *)(v22 + 8i64 * v21 + 304), v23);
          }
          v20 >>= 1;
          ++v21;
          LOWORD(v17) = (unsigned __int16)v17 >> 1;
        }
        while( v21 < 5 );
      }
    }
    KeUpdateQosGroupingSets((VOID *)a1, (unsigned int)v14, v17);
    v5 = (_KPRCB *)(a1 + 33128);
    if( !a3 )
      v13 = 1;
  }
  if( v13 )
    PpmEventProcessorPerfStateChange(v5, (_PROC_PERF_DOMAIN *)a2);
  return v12;
}

Referenced by:

PoSetProcessorQoS
PpmIdleExecuteTransition
PpmPerfApplyProcessorState