PpmRegisterPerfStates

INT64 __fastcall PpmRegisterPerfStates(INT64 a1, CHAR a2){
  INT64 v3; 
  __int64 v4; 
  unsigned int v5; 
  LARGE_INTEGER *v6; 
  unsigned int v7; 
  int v8; 
  unsigned int v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  __int64 *v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  _DWORD *v17; 
  int v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  bool v22; 
  LARGE_INTEGER *PoolWithTag; 
  __int64 v24; 
  LARGE_INTEGER *v25; 
  __int64 v26; 
  __int64 v27; 
  unsigned int v28; 
  unsigned int v29; 
  __int64 v30; 
  char *v31; 
  __int64 v32; 
  __int64 v33; 
  unsigned int v34; 
  __int64 v35; 
  int v36; 
  __int64 v37; 
  UINT64 v38; 
  char v39; 
  __int64 *v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  UINT16 v46; 
  UINT64 *v47; 
  unsigned int FirstSetRightGroupAffinity; 
  __int64 v49; 
  LARGE_INTEGER PerformanceCounter; 
  int v51; 
  __int64 v52; 
  int *p_HighPart; 
  char v54; 
  unsigned int v55; 
  int v56; 
  LARGE_INTEGER *v57; 
  __int64 QuadPart; 
  __int64 *v59; 
  __int64 v60; 
  __int64 *v61; 
  __int64 v62; 
  __int64 v63; 
  LARGE_INTEGER **v64; 
  char v65; 
  INT64 v66; 
  char v67; 
  char v68; 
  __int64 v70; 
  __int64 v71; 
  LARGE_INTEGER *v72; 
  __int64 v73; 
  __int64 v74; 
  _QWORD *v75; 
  PVOID *v76; 
  int v77[8]; 
  int v78; 
  int v79; 
  __int64 v80; 
  __int64 v81; 
  unsigned int v82; 
  int v83; 
  __int64 v84; 
  __int64 v85; 
  __int64 v86; 
  __int64 v87; 
  _QWORD v88[3]; 
  __int64 v89; 
  INT64 v90; 
  _GROUP_AFFINITY Base; 
  _EXT_SET_PARAMETERS_V0 Parameters; 
  _KAFFINITY_EX MappedAsImage; 
  _KAFFINITY_EX result; 
  v90 = a1;
  v3 = a1;
  memset((INT64)&result, 0i64);
  Base = 0i64;
  memset((INT64)MappedAsImage.Bitmap, 0i64);
  v4 = *(unsigned int *)(v3 + 16);
  v5 = *(_DWORD *)(v3 + 36);
  v6 = 0i64;
  LOBYTE(v78) = 0;
  v83 = *(_DWORD *)(v3 + 20);
  LODWORD(v86) = v4;
  *(_OWORD *)&v88[1] = 0i64;
  *(_DWORD *)&MappedAsImage.Count = 1310721;
  memset((INT64)&MappedAsImage.Reserved, 0i64);
  KeQueryActiveProcessorAffinity(&result);
  v87 = 0i64;
  v7 = 0;
  v79 = 0;
  if( !a2 )
    PpmAcquireLock(&PpmPerfPolicyLock);
  v8 = -1;
  v81 = -1i64;
  v9 = 0;
  if( v5 )
  {
    v10 = *(_QWORD *)(v3 + 408);
    do
    {
      v11 = *(unsigned int *)(v10 + 24i64 * v9 + 12);
      if( (unsigned int)v11 >= 2 )
        goto LABEL_115;
      if( *((_DWORD *)&v81 + v11) == -1 )
        *((_DWORD *)&v81 + v11) = v9;
      ++v9;
    }
    while( v9 < v5 );
    v8 = v81;
  }
  if( v8 == -1 && HIDWORD(v81) == -1 )
  {
LABEL_115:
    v36 = -1073741811;
    goto LABEL_126;
  }
  v12 = 0;
  v13 = &v81;
  v14 = 2i64;
  do
  {
    v22 = *(_DWORD *)v13 == -1;
    v15 = v12 + 1;
    v13 = (__int64 *)((char *)v13 + 4);
    if( v22 )
      v15 = v12;
    v12 = v15;
    --v14;
  }
  while( v14 );
  LODWORD(v84) = v15;
  if( (_DWORD)v4 )
  {
    v16 = v4;
    v17 = (_DWORD *)(*(_QWORD *)(v3 + 416) + 28i64);
    do
    {
      v22 = *v17 == 1;
      v18 = v7 + 1;
      v17 += 8;
      if( !v22 )
        v18 = v7;
      v7 = v18;
      --v16;
    }
    while( v16 );
    v79 = v18;
  }
  v19 = (136 * v4 + 775) & 0xFFFFFFF8;
  v20 = v19 + 48 * v12 * v4;
  v21 = v20;
  v22 = v7 == 0;
  if( v7 )
  {
    v21 = v20 + (v7 << 7);
    v22 = v7 == 0;
  }
  if( v22 )
    v20 = 0;
  PoolWithTag = (LARGE_INTEGER *)ExAllocatePoolWithTag(NonPagedPoolNx, v21, 0x704D5050ui64);
  v6 = PoolWithTag;
  if( !PoolWithTag )
  {
    v36 = -1073741670;
    goto LABEL_126;
  }
  memset((INT64)PoolWithTag, 0i64);
  v24 = v20;
  v25 = v6 + 96;
  v26 = 0i64;
  v27 = (__int64)v6 + v24;
  v28 = 0;
  v88[0] = (char *)v6 + v19;
  v82 = 0;
  v87 = v27;
  if( *(_BYTE *)(v3 + 11) )
    LODWORD(PpmPerfQosTransitionHysteresis) = *(_DWORD *)(v3 + 48);
  v29 = 0;
  LODWORD(v80) = 0;
  if( !(_DWORD)v4 )
  {
LABEL_47:
    if( (unsigned int)KeIsEmptyAffinityEx(&MappedAsImage) )
    {
      v6[26].LowPart = 2;
      v71 = 0i64;
      if( (_DWORD)v4 )
      {
        v72 = v25 + 2;
        while( v72->LowPart != 1 )
        {
          v71 = (unsigned int)(v71 + 1);
          v72 += 17;
          if( (unsigned int)v71 >= (unsigned int)v4 )
            goto LABEL_49;
        }
        v6[2] = v25[17 * v71];
        v6[26].LowPart = 1;
      }
    }
    else
    {
      KeFirstGroupAffinityEx(&Base, (UINT8)&MappedAsImage, v46, v47);
      FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(&Base);
      KeGetPrcb(FirstSetRightGroupAffinity);
      v6[2].QuadPart = v49 + 33128;
      BYTE4(v6[25].QuadPart) = *(_BYTE *)(v49 + 33208);
    }
LABEL_49:
    KeCopyAffinityEx((__int64)&v6[3], &MappedAsImage.Count);
    v6[28] = *(LARGE_INTEGER *)(v3 + 256);
    v6[30] = *(LARGE_INTEGER *)(v3 + 272);
    v6[31] = *(LARGE_INTEGER *)(v3 + 280);
    v6[32] = *(LARGE_INTEGER *)(v3 + 288);
    v6[33] = *(LARGE_INTEGER *)(v3 + 296);
    v6[29] = *(LARGE_INTEGER *)(v3 + 264);
    v6[24] = *(LARGE_INTEGER *)(v3 + 80);
    v6[27].QuadPart = (LONGLONG)v25;
    v6[68].HighPart = 1;
    PerformanceCounter = KeQueryPerformanceCounter(0i64);
    v51 = v83;
    v52 = 5i64;
    v6[94] = PerformanceCounter;
    v6[39].HighPart = v51;
    v6[25].LowPart = v4;
    v6[41].HighPart = *(_DWORD *)(v3 + 44);
    v6[40].LowPart = *(_DWORD *)(v3 + 24);
    v6[40].HighPart = *(_DWORD *)(v3 + 28);
    v6[41].LowPart = *(_DWORD *)(v3 + 32);
    BYTE1(v6[44].LowPart) = *(_BYTE *)(v3 + 4);
    v6[36] = *(LARGE_INTEGER *)(v3 + 336);
    v6[37] = *(LARGE_INTEGER *)(v3 + 344);
    v6[38] = *(LARGE_INTEGER *)(v3 + 352);
    v6[34] = *(LARGE_INTEGER *)(v3 + 320);
    v6[35] = *(LARGE_INTEGER *)(v3 + 328);
    HIBYTE(v6[44].QuadPart) = *(_BYTE *)(v3 + 52);
    p_HighPart = &v6[70].HighPart;
    do
    {
      *(p_HighPart - 1) = 100;
      *p_HighPart = v51;
      p_HighPart += 10;
      --v52;
    }
    while( v52 );
    BYTE2(v6[44].u.LowPart) = *(_BYTE *)(v3 + 6);
    BYTE3(v6[44].QuadPart) = *(_BYTE *)(v3 + 7);
    BYTE4(v6[44].QuadPart) = *(_BYTE *)(v3 + 8);
    if( *(_WORD *)(v3 + 4) == 253 || (v54 = 1, *(_QWORD *)(v3 + 352)) )
      v54 = 0;
    BYTE6(v6[44].QuadPart) = v54;
    BYTE5(v6[44].QuadPart) = *(_BYTE *)(v3 + 11);
    if( PpmPerfQosManageIdleProcessors == -1 )
      PpmPerfQosManageIdleProcessors = *(_BYTE *)(v3 + 12) != 0;
    v6[42] = *(LARGE_INTEGER *)(v3 + 56);
    v6[43] = *(LARGE_INTEGER *)(v3 + 64);
    LOBYTE(v6[44].LowPart) = 100;
    if( PpmCheckMinimumPeriod <= (unsigned __int64)*(unsigned int *)(v3 + 40) )
      PpmCheckMinimumPeriod = *(unsigned int *)(v3 + 40);
    if( v6[31].QuadPart )
      PpmAllowedActions |= 0x40u;
    if( v6[30].QuadPart )
      PpmAllowedActions |= 0x20u;
    if( v6[29].QuadPart )
      PpmAllowedActions |= 0x200u;
    if( v6[33].QuadPart )
      PpmAllowedActions |= 0x80u;
    if( v6[32].QuadPart )
      PpmAllowedActions |= 0x100u;
    if( *(_BYTE *)(v3 + 9) )
      PpmPerfEppViaPerfControl = 1;
    if( *(_BYTE *)(v3 + 10) )
      PpmPerfAutonomousActivityWindowViaPerfControl = 1;
    _InterlockedOr(v77, 0);
    v55 = 0;
    if( (_DWORD)v4 )
    {
      v56 = v84;
      v57 = v6 + 98;
      do
      {
        if( v57->LowPart != 2 )
        {
          QuadPart = v57[-2].QuadPart;
          v59 = &v81;
          *(_OWORD *)&v88[1] = 0i64;
          *(_DWORD *)(QuadPart + 56) = 0x10000;
          v60 = 2i64;
          *(_QWORD *)QuadPart = v6;
          *(_QWORD *)(QuadPart + 8) = &v6[17 * v55 + 96];
          v61 = &v88[1];
          v62 = v88[0] + 48i64 * v56 * v55;
          do
          {
            if( *(_DWORD *)v59 != -1 )
            {
              *v61 = v62;
              v62 += 48i64;
            }
            v59 = (__int64 *)((char *)v59 + 4);
            ++v61;
            --v60;
          }
          while( v60 );
          if( v57->LowPart )
          {
            PpmPerfResizeHistory(QuadPart);
            v73 = 2i64;
            v74 = QuadPart - (_QWORD)&v88[1];
            v75 = &v88[1];
            do
            {
              if( *v75 )
                *(_QWORD *)((char *)v75 + v74 + 88) = *v75;
              ++v75;
              --v73;
            }
            while( v73 );
          }
          else
          {
            PpmInstallFeedbackCounters(QuadPart - 33128, &v88[1]);
          }
        }
        ++v55;
        v57 += 17;
      }
      while( v55 < (unsigned int)v4 );
      v3 = v90;
      v26 = 0i64;
      v7 = v79;
    }
    if( !PpmPerfGlobalContext )
      PpmPerfGlobalContext = *(_QWORD *)(v3 + 72);
    v63 = PpmPerfControlReadFeedback;
    if( !PpmPerfControlReadFeedback )
    {
      v63 = *(_QWORD *)(v3 + 360);
      PpmPerfControlReadFeedback = v63;
    }
    if( !PpmPerfControlAcquirePerformance )
      PpmPerfControlAcquirePerformance = *(_QWORD *)(v3 + 368);
    if( !PpmPerfControlCommitPerformance )
      PpmPerfControlCommitPerformance = *(_QWORD *)(v3 + 376);
    if( !PpmParkPreferenceHandler )
      PpmParkPreferenceHandler = *(__int64(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD))(v3 + 384);
    if( !PpmParkMaskHandler )
      PpmParkMaskHandler = *(__int64(__fastcall **)(_QWORD, _QWORD))(v3 + 392);
    if( !PpmCheckCompleteHandler )
      PpmCheckCompleteHandler = *(__int64(__fastcall **)(_QWORD, _QWORD))(v3 + 400);
    if( !PpmPerfControlStartPolicyUpdate )
      PpmPerfControlStartPolicyUpdate = *(__int64(**)(void))(v3 + 304);
    if( !PpmPerfControlCompletePolicyUpdate )
      PpmPerfControlCompletePolicyUpdate = *(__int64(**)(void))(v3 + 312);
    if( v63 )
      PpmCheckPollForFeedback = 1;
    v64 = (LARGE_INTEGER **)qword_140CFB4F0;
    ++PpmPerfDomainCount;
    if( *(INT64 **)qword_140CFB4F0 != &PpmPerfDomainHead )
      __fastfail(3u);
    v6->QuadPart = (LONGLONG)&PpmPerfDomainHead;
    v65 = 1;
    v6[1].QuadPart = (LONGLONG)v64;
    *v64 = v6;
    v66 = PpmPerfDomainHead;
    qword_140CFB4F0 = (__int64)v6;
    LOBYTE(v78) = 1;
    if( (INT64 *)PpmPerfDomainHead != &PpmPerfDomainHead )
    {
      do
      {
        v67 = *(_BYTE *)(v66 + 357);
        v66 = *(_QWORD *)v66;
        v65 = v67 != 0 ? v65 : 0;
      }
      while( (INT64 *)v66 != &PpmPerfDomainHead );
      LOBYTE(v78) = v65;
    }
    KeOrAffinityEx(&MappedAsImage, &PpmPerfStatesRegistered, &PpmPerfStatesRegistered);
    WORD2(v6[95].QuadPart) = 257;
    PpmUpdateProcessorPolicy(&PpmAllowedActions, (__int64)v6);
    PpmCheckResetProcessors((INT64)v6);
    if( ((MappedAsImage.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6] >> (KiProcessorIndexToNumberMappingTable[0] & 0x3F)) & 1) != 0 )
      PpmParkApplyPolicy();
    PpmCheckReInit();
    v6 = 0i64;
    v36 = 0;
    PpmPerfUpdateDomainPolicy(1);
    goto LABEL_109;
  }
  v30 = 0i64;
  v31 = (char *)&v6[98].QuadPart + 4;
  while( 1 )
  {
    v32 = *(_QWORD *)(v3 + 416);
    *((_DWORD *)v31 - 1) = *(_DWORD *)(v30 + v32 + 28);
    v33 = *(unsigned int *)(v30 + v32);
    if( !*(_DWORD *)(v30 + v32 + 28) )
      break;
    v34 = -1;
    *(_DWORD *)v31 = v33;
    v22 = *(_DWORD *)(v30 + v32 + 28) == 1;
    LODWORD(v85) = -1;
    if( v22 )
    {
      v82 = v28 + 1;
      v70 = v27 + ((unsigned __int64)v28 << 7);
      *(_WORD *)(v70 + 54) = 100;
      v36 = PpmAllocatePerfCheck(v70);
      if( v36 < 0 )
        goto LABEL_125;
      *(_QWORD *)(v31 - 20) = v70;
      v34 = v85;
      goto LABEL_37;
    }
LABEL_38:
    *((_DWORD *)v31 + 7) = 100;
    *(_QWORD *)(v31 - 12) = *(_QWORD *)(v30 + v32 + 8);
    *((_DWORD *)v31 + 1) = *(_DWORD *)(v30 + v32 + 16);
    *((_DWORD *)v31 + 2) = *(_DWORD *)(v30 + v32 + 20);
    *((_DWORD *)v31 + 3) = *(_DWORD *)(v30 + v32 + 24);
    *((_DWORD *)v31 + 14) = v83;
    v39 = 0;
    *(_QWORD *)(v31 + 108) = 0i64;
    *((_DWORD *)v31 + 9) = 100;
    *((_DWORD *)v31 + 13) = 100;
    *((_DWORD *)v31 + 15) = 1;
    *((_DWORD *)v31 + 16) = 100;
    *((_DWORD *)v31 + 17) = 100;
    *((_DWORD *)v31 + 24) = 100;
    *((_DWORD *)v31 + 25) = 100;
    if( !*(_BYTE *)(v3 + 7) && *(_BYTE *)(v3 + 11) )
      v39 = 1;
    v31[105] = v39;
    if( *(_DWORD *)(v30 + v32 + 16) < 0x64u )
    {
      *(_QWORD *)(v31 + 20) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      PopDiagTraceProcessorThrottlePerfTrack((unsigned int)(100 - *(_DWORD *)(v30 + v32 + 16)), v34);
    }
    v40 = &v81;
    v41 = (unsigned int)v84 * v29;
    v42 = 2i64;
    v43 = v88[0] + 48 * v41;
    do
    {
      v44 = *(unsigned int *)v40;
      if( (_DWORD)v44 != -1 )
      {
        v45 = *(_QWORD *)(v3 + 408);
        *(_QWORD *)(v43 + 40) = *(_QWORD *)(*(_QWORD *)(v3 + 424) + 8i64 * (unsigned int)(v41 + v44));
        *(_BYTE *)(v43 + 33) = *(_BYTE *)(v45 + 24 * v44 + 17);
        *(_BYTE *)(v43 + 32) = *(_BYTE *)(v45 + 24 * v44 + 16);
        *(_BYTE *)(v43 + 34) = *(_BYTE *)(v45 + 24 * v44 + 18);
        *(_BYTE *)(v43 + 35) = *(_BYTE *)(v45 + 24 * v44 + 8);
        *(_QWORD *)v43 = *(_QWORD *)(v45 + 24 * v44);
        v43 += 48i64;
      }
      v40 = (__int64 *)((char *)v40 + 4);
      --v42;
    }
    while( v42 );
    LODWORD(v4) = v86;
    v29 = v80 + 1;
    v28 = v82;
    v30 += 32i64;
    v27 = v87;
    v31 += 136;
    LODWORD(v80) = v29;
    if( v29 >= (unsigned int)v86 )
    {
      v7 = v79;
      v25 = v6 + 96;
      v26 = 0i64;
      goto LABEL_47;
    }
  }
  v34 = *(_DWORD *)(v30 + v32);
  if( (_DWORD)v33 != -1
    && ((PpmPerfStatesRegistered.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v33] >> 6] >> (KiProcessorIndexToNumberMappingTable[v33] & 0x3F)) & 1) == 0 )
  {
    KeGetPrcb((unsigned int)v33);
    v89 = v35;
    v85 = v35 + 33128;
    v36 = PpmAllocatePerfCheck(v35 + 33128);
    if( v36 < 0 )
      goto LABEL_125;
    KeAddProcessorAffinityEx(&MappedAsImage, v34);
    v37 = v89;
    *(_QWORD *)(v31 - 20) = v85;
    v38 = (unsigned int)PpmPerfQosTransitionHysteresisOverride;
    if( PpmPerfQosTransitionHysteresisOverride == -1 )
      v38 = (unsigned int)PpmPerfQosTransitionHysteresis;
    *(_QWORD *)(v37 + 33256) = PpmConvertTime(v38, 0xF4240ui64, 1000000i64 * *(unsigned int *)(v37 + 68));
LABEL_37:
    v29 = v80;
    goto LABEL_38;
  }
  v36 = -1073741811;
LABEL_125:
  v7 = v79;
LABEL_126:
  PpmReleaseLock(&PpmPerfPolicyLock);
  v26 = 0i64;
LABEL_109:
  v68 = v78;
  if( ((unsigned int)PpmPerfDomainCount > 1 || (_BYTE)v78)
    && (unsigned int)KeIsEqualAffinityEx(&PpmPerfStatesRegistered.Count, (unsigned __int16 *)&PpmCheckRegistered) )
  {
    PpmAcquireLock(&PpmPerfPolicyLock);
    PpmPerfSchedulerDirectedPerfStatesSupported = v68;
    PpmReinitializeHeteroEngine(1);
  }
  if( v6 )
  {
    if( v7 )
    {
      v76 = (PVOID *)(v87 + 16);
      v26 = v7;
      do
      {
        if( *v76 )
        {
          ExFreePoolWithTag(*v76, 0x704D5050u);
          *v76 = 0i64;
        }
        v76 += 16;
        --v26;
      }
      while( v26 );
    }
    ExFreePoolWithTag(v6, 0x704D5050u);
  }
  Parameters.NoWakeTolerance = -1i64;
  *(_QWORD *)&Parameters.Version = v26;
  KeSetTimer2(&PpmPerfTelemetryTimer, -36000000000i64, 36000000000i64, &Parameters);
  return(unsigned int)v36;
}

Referenced by:

PpmPerfRegisterNativePerfStates