KeBuildLogicalProcessorSystemInformation

VOID __fastcall KeBuildLogicalProcessorSystemInformation(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4){
  _DWORD *v4; 
  unsigned int v5; 
  __int16 v7; 
  unsigned int v8; 
  unsigned int v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  bool v14; 
  unsigned int v15; 
  _QWORD *v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  _QWORD *v22; 
  UINT8 *v23; 
  __int64 v24; 
  GROUP_AFFINITY GroupAffinity; 
  __int16 v26; 
  unsigned int v27; 
  unsigned int v28; 
  v28 = a3;
  v26 = a1;
  GroupAffinity = 0i64;
  v4 = (_DWORD *)a4;
  v27 = 0;
  v5 = a3;
  v7 = a1;
  v8 = 0;
  v9 = 0;
  if( (_DWORD)KeNumberProcessors_0 )
  {
    do
    {
      v10 = (__int64)*(&KiProcessorBlock + v9);
      v11 = *(unsigned __int8 *)(v10 + 208);
      if( (_WORD)v11 == v7 )
      {
        v12 = *(_QWORD *)(v10 + 8 * v11 + 33688);
        GroupAffinity.Mask = v12;
        GroupAffinity.Group = v11;
        if( *(_DWORD *)(v10 + 36) == (unsigned int)KeFindFirstSetLeftGroupAffinity(&GroupAffinity) )
        {
          v8 += 32;
          if( v8 <= v5 )
          {
            *(_QWORD *)a2 = v12;
            *(_DWORD *)(a2 + 8) = 3;
            *(_QWORD *)(a2 + 24) = 0i64;
            *(_QWORD *)(a2 + 16) = 0i64;
            a2 += 32i64;
          }
        }
        v13 = *(_QWORD *)(v10 + 33880);
        GroupAffinity.Mask = v13;
        if( *(_DWORD *)(v10 + 36) == (unsigned int)KeFindFirstSetLeftGroupAffinity(&GroupAffinity) )
        {
          v14 = *(_QWORD *)(v10 + 200) != v13;
          v8 += 32;
          if( v8 <= v5 )
          {
            *(_QWORD *)(a2 + 16) = 0i64;
            *(_BYTE *)(a2 + 16) = v14;
            *(_QWORD *)a2 = v13;
            *(_DWORD *)(a2 + 8) = 0;
            *(_QWORD *)(a2 + 24) = 0i64;
            a2 += 32i64;
          }
        }
        v15 = 0;
        if( *(_DWORD *)(v10 + 33556) )
        {
          v16 = (_QWORD *)(a2 + 16);
          while( 1 )
          {
            v17 = *(_QWORD *)(v10 + 200);
            v18 = v15;
            v19 = *(_QWORD *)(v10 + 8i64 * v15 + 33904);
            if( !v19 )
              goto LABEL_23;
            GroupAffinity.Mask = *(_QWORD *)(v10 + 8i64 * v15 + 33904);
            v17 = v19;
            if( *(_DWORD *)(v10 + 36) == (unsigned int)KeFindFirstSetLeftGroupAffinity(&GroupAffinity) )
              break;
LABEL_11:
            if( ++v15 >= *(_DWORD *)(v10 + 33556) )
            {
              v9 = v27;
              v5 = v28;
              goto LABEL_13;
            }
          }
          v18 = v15;
LABEL_23:
          v8 += 32;
          if( v8 <= v28 )
          {
            *(_QWORD *)a2 = v17;
            *((_DWORD *)v16 - 2) = 2;
            v16[1] = 0i64;
            a2 += 32i64;
            *v16 = 0i64;
            *v16 = *(_QWORD *)(v10 + 12 * v18 + 33496);
            *((_DWORD *)v16 + 2) = *(_DWORD *)(v10 + 12 * v18 + 33504);
            v16 += 4;
          }
          goto LABEL_11;
        }
LABEL_13:
        v7 = v26;
      }
      v27 = ++v9;
    }
    while( v9 < (unsigned int)KeNumberProcessors_0 );
    v4 = (_DWORD *)a4;
  }
  v20 = (unsigned __int16)KeNumberNodes;
  v21 = 0;
  if( KeNumberNodes )
  {
    v22 = (_QWORD *)(a2 + 16);
    v23 = &KeNodeBlock;
    do
    {
      v24 = *(_QWORD *)(*(_QWORD *)v23 + 136i64);
      if( v24 )
      {
        if( *(_WORD *)(*(_QWORD *)v23 + 144i64) == v7 )
        {
          v8 += 32;
          if( v8 <= v5 )
          {
            *v22 = 0i64;
            *(_DWORD *)v22 = v21;
            *(v22 - 2) = v24;
            *((_DWORD *)v22 - 2) = 1;
            v22[1] = 0i64;
            v22 += 4;
          }
        }
      }
      ++v21;
      v23 += 8;
    }
    while( v21 < v20 );
  }
  *v4 = v8;
}

Referenced by:

ExpQuerySystemInformation