KeBuildLogicalProcessorSystemInformation

NTSTATUS __stdcall KeBuildLogicalProcessorSystemInformation(
        UINT16 Group,
        VOID *SystemInformation,
        UINT64 SystemInformationLength,
        UINT64 *ReturnedLength){
  UINT64 *v4; 
  unsigned int v5; 
  UINT16 v7; 
  NTSTATUS v8; 
  unsigned int v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  unsigned __int64 v15; 
  int v16; 
  bool v17; 
  unsigned int v18; 
  _QWORD *v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  unsigned int v24; 
  unsigned int v25; 
  _QWORD *v26; 
  __int64 *v27; 
  __int64 v28; 
  _GROUP_AFFINITY GroupAffinity; 
  unsigned int v32; 
  unsigned int v33; 

  v33 = SystemInformationLength;
  GroupAffinity = 0i64;
  v4 = ReturnedLength;
  v32 = 0;
  v5 = SystemInformationLength;
  v7 = Group;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  if( (_DWORD)KeNumberProcessors_0 )
  {
    do
    {
      v11 = (__int64)*(&KiProcessorBlock + v10);
      v12 = *(unsigned __int8 *)(v11 + 208);
      if( (_WORD)v12 == v7 )
      {
        v13 = *(_QWORD *)(v11 + 8 * v12 + 33688);
        GroupAffinity.Mask = v13;
        GroupAffinity.Group = v12;
        KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
        if( *(_DWORD *)(v11 + 36) == v14 )
        {
          v9 += 32;
          if( v9 > v5 )
          {
            v8 = -1073741820;
          }
          else
          {
            *(_QWORD *)SystemInformation = v13;
            *((_DWORD *)SystemInformation + 2) = 3;
            *((_QWORD *)SystemInformation + 3) = 0i64;
            *((_QWORD *)SystemInformation + 2) = 0i64;
            SystemInformation = (char *)SystemInformation + 32;
          }
        }
        v15 = *(_QWORD *)(v11 + 33880);
        GroupAffinity.Mask = v15;
        KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
        if( *(_DWORD *)(v11 + 36) == v16 )
        {
          v17 = *(_QWORD *)(v11 + 200) != v15;
          v9 += 32;
          if( v9 <= v5 )
          {
            *((_QWORD *)SystemInformation + 2) = 0i64;
            *((_BYTE *)SystemInformation + 16) = v17;
            *(_QWORD *)SystemInformation = v15;
            *((_DWORD *)SystemInformation + 2) = 0;
            *((_QWORD *)SystemInformation + 3) = 0i64;
            SystemInformation = (char *)SystemInformation + 32;
          }
          else
          {
            v8 = -1073741820;
          }
        }
        v18 = 0;
        if( *(_DWORD *)(v11 + 33556) )
        {
          v19 = (char *)SystemInformation + 16;
          while( 1 )
          {
            v20 = *(_QWORD *)(v11 + 200);
            v21 = v18;
            v22 = *(_QWORD *)(v11 + 8i64 * v18 + 33904);
            if( !v22 )
              goto LABEL_24;
            GroupAffinity.Mask = *(_QWORD *)(v11 + 8i64 * v18 + 33904);
            v20 = v22;
            KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
            if( *(_DWORD *)(v11 + 36) == v23 )
              break;
LABEL_12:
            if( ++v18 >= *(_DWORD *)(v11 + 33556) )
            {
              v10 = v32;
              v5 = v33;
              goto LABEL_14;
            }
          }
          v21 = v18;
LABEL_24:
          v9 += 32;
          if( v9 > v33 )
          {
            v8 = -1073741820;
          }
          else
          {
            *(_QWORD *)SystemInformation = v20;
            *((_DWORD *)v19 - 2) = 2;
            v19[1] = 0i64;
            SystemInformation = (char *)SystemInformation + 32;
            *v19 = 0i64;
            *v19 = *(_QWORD *)(v11 + 12 * v21 + 33496);
            *((_DWORD *)v19 + 2) = *(_DWORD *)(v11 + 12 * v21 + 33504);
            v19 += 4;
          }
          goto LABEL_12;
        }
LABEL_14:
        v7 = Group;
      }
      v32 = ++v10;
    }
    while( v10 < (unsigned int)KeNumberProcessors_0 );
    v4 = ReturnedLength;
  }
  v24 = (unsigned __int16)KeNumberNodes;
  v25 = 0;
  if( KeNumberNodes )
  {
    v26 = (char *)SystemInformation + 16;
    v27 = KeNodeBlock;
    do
    {
      v28 = *(_QWORD *)(*v27 + 136);
      if( v28 && *(_WORD *)(*v27 + 144) == v7 )
      {
        v9 += 32;
        if( v9 <= v5 )
        {
          *v26 = 0i64;
          *(_DWORD *)v26 = v25;
          *(v26 - 2) = v28;
          *((_DWORD *)v26 - 2) = 1;
          v26[1] = 0i64;
          v26 += 4;
        }
        else
        {
          v8 = -1073741820;
        }
      }
      ++v25;
      ++v27;
    }
    while( v25 < v24 );
  }
  *(_DWORD *)v4 = v9;
  return v8;
}

Referenced by:

ExpQuerySystemInformation