PopProcessorInformation

INT64 __fastcall PopProcessorInformation(INT64 a1, INT64 a2, UINT16 a3, _DWORD *a4){
  unsigned int v4; 
  KAFFINITY GroupAffinity; 
  unsigned __int64 v9; 
  _ETHREAD *CurrentThread; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  int v17; 
  unsigned __int16 *v19[2]; 
  UINT16 v20; 
  int v21; 
  __int16 v22; 
  UINT64 ProcessorNumber; 
  v4 = 0;
  v21 = 0;
  v22 = 0;
  LODWORD(ProcessorNumber) = 0;
  GroupAffinity = KeQueryGroupAffinity(a3);
  v9 = (0x101010101010101i64
      * ((((GroupAffinity - ((GroupAffinity >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
        + (((GroupAffinity - ((GroupAffinity >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
        + ((((GroupAffinity - ((GroupAffinity >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
          + (((GroupAffinity - ((GroupAffinity >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
  if( (unsigned int)(24 * v9) > 0x600 )
  {
    if( a4 )
      *a4 = 0;
    return(unsigned int)-1073741789;
  }
  else
  {
    if( (_DWORD)v9 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v11 = 0;
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockSharedEx((UINT64)&PpmIdlePolicyLock, 0i64);
      v20 = a3;
      v19[1] = (unsigned __int16 *)GroupAffinity;
      v19[0] = 0i64;
      while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v19) && v11 < (unsigned int)v9 )
      {
        KeGetPrcb((unsigned int)ProcessorNumber);
        v13 = v12;
        *(_DWORD *)(a1 + 24i64 * v11) = *(unsigned __int8 *)(v12 + 209);
        PpmPerfGetCurrentState(
          v12,
          (_DWORD *)(a1 + 8 + 24i64 * v11),
          (unsigned int *)(a1 + 12 + 24i64 * v11),
          0i64,
          0i64,
          0i64);
        v14 = *(_QWORD *)(v13 + 33128);
        if( v14 )
          v15 = *(_DWORD *)(v14 + 316);
        else
          v15 = *(_DWORD *)(v13 + 68);
        *(_DWORD *)(a1 + 24i64 * v11 + 4) = v15;
        v16 = *(_QWORD *)(v13 + 0x8000);
        if( v16 )
        {
          *(_DWORD *)(a1 + 24i64 * v11 + 16) = *(_DWORD *)(v16 + 32);
          v17 = *(_DWORD *)(v16 + 16) + 1;
        }
        else
        {
          *(_DWORD *)(a1 + 24i64 * v11 + 16) = 0;
          v17 = 0;
        }
        *(_DWORD *)(a1 + 24i64 * v11++ + 20) = v17;
      }
      PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
    }
    *a4 = 24 * v9;
  }
  return v4;
}

Referenced by:

NtPowerInformation