PpmHeteroUpdateHgsConfiguration

CHAR __stdcall PpmHeteroUpdateHgsConfiguration(){
  CHAR v0; 
  __int64 v2; 
  __int64 v3; 
  char v4; 
  int *v5; 
  _BYTE *v6; 
  int IsEmptyAffinity; 
  _BYTE *v8; 
  unsigned int v9; 
  int v10; 
  char v11; 
  __int64 v12; 
  unsigned int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned int v17; 
  int v18; 
  char v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  UINT64 ProcessorNumber; 
  unsigned __int16 *v25; 
  __int64 v26; 
  __int16 v27; 
  int v28; 
  __int16 v29; 
  unsigned __int64 v30; 
  _KAFFINITY_EX v31; 
  int v32; 
  _DWORD result[43]; 
  v28 = 0;
  v29 = 0;
  LODWORD(ProcessorNumber) = 0;
  memset((INT64)&result[1], 0i64);
  memset((INT64)v31.Bitmap, 0i64);
  v0 = 0;
  if( PpmHeteroHgsEnabled )
  {
    if( !(unsigned int)KeIsEmptyAffinityEx(&PpmCheckRegistered) )
    {
      v30 = __readmsr(0x1B1u);
      if( (v30 & 0x4000000) != 0 )
      {
        v32 = 1310721;
        PpmHeteroHgsPopulated = 1;
        memset((INT64)result, 0i64);
        *(_DWORD *)&v31.Count = 1310721;
        memset((INT64)&v31.Reserved, 0i64);
        v26 = qword_140C11268[0];
        v27 = 0;
        v25 = (unsigned __int16 *)&PpmCheckRegistered;
        while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
        {
          KeGetPrcb((unsigned int)ProcessorNumber);
          v3 = *(unsigned __int16 *)(v2 + 33274);
          if( !*(_BYTE *)(PpmHeteroHgsInterface + 8 * v3 + 16)
            || (v4 = *(_BYTE *)(PpmHeteroHgsInterface + 8 * v3 + 17), v5 = (int *)&v31, !v4) )
          {
            v5 = &v32;
          }
          KeAddProcessorAffinityEx(v5, ProcessorNumber);
        }
        if( (unsigned int)KeIsEmptyAffinityEx(&v31) )
        {
          v26 = qword_140C11268[0];
          v27 = 0;
          v25 = (unsigned __int16 *)&PpmCheckRegistered;
          while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
          {
            KeGetPrcb((unsigned int)ProcessorNumber);
            if( v6[33278] )
            {
              v0 = 1;
              v6[33278] = 0;
            }
            if( v6[33277] )
            {
              v0 = 1;
              v6[33277] = 0;
            }
            if( v6[33276] )
            {
              v0 = 1;
              v6[33276] = 0;
            }
          }
        }
        else
        {
          IsEmptyAffinity = KeIsEmptyAffinityEx(&v32);
          v27 = 0;
          v25 = (unsigned __int16 *)&v32;
          v26 = *(_QWORD *)&result[1];
          while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
          {
            KeGetPrcb((unsigned int)ProcessorNumber);
            if( v8[33278] )
            {
              v0 = 1;
              v8[33278] = 0;
            }
            if( v8[33277] )
            {
              v0 = 1;
              v8[33277] = 0;
            }
            if( v8[33276] != 1 )
            {
              v0 = 1;
              v8[33276] = 1;
            }
          }
          v9 = -1;
          v10 = KeCountSetBitsAffinityEx(&v31);
          if( v10 )
          {
            v11 = IsEmptyAffinity == 0;
            do
            {
              v26 = v31.Bitmap[0];
              v25 = (unsigned __int16 *)&v31;
              v27 = 0;
              while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
              {
                KeGetPrcb((unsigned int)ProcessorNumber);
                if( *(_BYTE *)(v12 + 33276) )
                {
                  v0 = 1;
                  *(_BYTE *)(v12 + 33276) = 0;
                }
              }
              v13 = -1;
              v26 = v31.Bitmap[0];
              v25 = (unsigned __int16 *)&v31;
              v27 = 0;
              while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
              {
                KeGetPrcb((unsigned int)ProcessorNumber);
                v15 = *(unsigned __int16 *)(v14 + 33274);
                if( (v9 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16) > v9)
                  && v13 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16) )
                {
                  v13 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16);
                }
              }
              v26 = v31.Bitmap[0];
              v25 = (unsigned __int16 *)&v31;
              v27 = 0;
              while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
              {
                KeGetPrcb((unsigned int)ProcessorNumber);
                if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * *(unsigned __int16 *)(v16 + 33274) + 16) == v13 )
                {
                  if( *(_BYTE *)(v16 + 33277) != v11 )
                  {
                    v0 = 1;
                    *(_BYTE *)(v16 + 33277) = v11;
                  }
                  --v10;
                }
              }
              v9 = v13;
              ++v11;
            }
            while( v10 );
          }
          v17 = -1;
          v18 = KeCountSetBitsAffinityEx(&v31);
          if( v18 )
          {
            v19 = IsEmptyAffinity == 0;
            do
            {
              v26 = v31.Bitmap[0];
              v20 = -1;
              v25 = (unsigned __int16 *)&v31;
              v27 = 0;
              while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
              {
                KeGetPrcb((unsigned int)ProcessorNumber);
                v22 = *(unsigned __int16 *)(v21 + 33274);
                if( (v17 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17) > v17)
                  && v20 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17) )
                {
                  v20 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17);
                }
              }
              v26 = v31.Bitmap[0];
              v25 = (unsigned __int16 *)&v31;
              v27 = 0;
              while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
              {
                KeGetPrcb((unsigned int)ProcessorNumber);
                if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * *(unsigned __int16 *)(v23 + 33274) + 17) == v20 )
                {
                  if( *(_BYTE *)(v23 + 33278) != v19 )
                  {
                    v0 = 1;
                    *(_BYTE *)(v23 + 33278) = v19;
                  }
                  --v18;
                }
              }
              ++v19;
              v17 = v20;
            }
            while( v18 );
          }
        }
        v30 = __readmsr(0x1B1u) & 0xFFFFFFFFFBFFFFFFui64;
        __writemsr(0x1B1u, v30);
      }
    }
  }
  return v0;
}

Referenced by:

PopInitializeHeteroProcessors