PpmPerfArbitratorApplyProcessorState

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

Referenced by:

PoSetProcessorQoS
PpmIdleExecuteTransition
PpmPerfApplyProcessorState