KiComputeNumaCosts

INT64 __stdcall KiComputeNumaCosts(PVOID InfImage, UINT64 ImageSize){
  INT64 result; 
  __int64 v3; 
  int v4; 
  unsigned int v5; 
  unsigned int v6; 
  __int64 v7; 
  __int16 v8; 
  unsigned int v9; 
  UINT8 *v10; 
  struct _GROUP_AFFINITY *p_PreviousAffinity; 
  unsigned int v12; 
  struct _MDL *PartitionNodePagesForMdl; 
  MDL *v14; 
  char *v15; 
  unsigned __int8 CurrentIrql; 
  char *v17; 
  unsigned __int64 v18; 
  unsigned __int16 v19; 
  unsigned __int64 v20; 
  int v21; 
  unsigned int v22; 
  int i; 
  __int64 v24; 
  unsigned int v25; 
  int v26; 
  __int64 v27; 
  __int64 v28; 
  UINT8 *v29; 
  int v30; 
  __int64 v31; 
  int v32; 
  __int64 v33; 
  __int64 v34; 
  unsigned int v35; 
  unsigned __int64 v36; 
  __int64 v37; 
  unsigned int v38; 
  unsigned int v39; 
  unsigned int v40; 
  int v41; 
  __int64 *v42; 
  UINT8 *v43; 
  __int64 v44; 
  __int64 v45; 
  size_t v46; 
  unsigned __int16 v47; 
  unsigned int v48; 
  int j; 
  __int64 v50; 
  __int64 v51; 
  __int16 v52; 
  UINT64 Priority; 
  UINT64 Flags; 
  int v55; 
  int v56; 
  unsigned int v57; 
  unsigned int v58; 
  INT64 v59; 
  unsigned __int64 v60; 
  LARGE_INTEGER Affinity; 
  struct _GROUP_AFFINITY Affinity_8; 
  unsigned __int64 v63; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  __int16 Base[4]; 
  __int64 v66[127]; 
  result = (unsigned __int16)KeNumberNodes;
  PreviousAffinity = 0i64;
  if( (unsigned __int16)KeNumberNodes <= 1u )
  {
LABEL_2:
    LOBYTE(result) = 1;
    return result;
  }
  v3 = (unsigned __int16)KeNumberNodes * (unsigned int)(unsigned __int16)KeNumberNodes;
  result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 10 * v3, 0x634E654Bui64);
  KiActualNodeCost = (UINT8 *)result;
  if( result )
  {
    KiNodeGraph = (UINT8 *)(result + 8 * v3);
    if( (_DWORD)v3 )
      memset((void *)result, 0xFFu, 8 * v3);
    result = (unsigned __int16)KeNumberNodes;
    Affinity.QuadPart = -1i64;
    v4 = 0;
    v55 = 0;
    v5 = 0;
    v57 = 0;
    v6 = (unsigned __int16)KeNumberNodes;
    Affinity_8 = 0i64;
    if( !KeNumberNodes )
    {
LABEL_35:
      v19 = KeNumberNodes;
      v20 = 0i64;
      LODWORD(v59) = 0;
      v21 = 0;
      v58 = 0;
      v22 = 0;
      for( i = (unsigned __int16)KeNumberNodes; v22 < v19; v58 = v22 )
      {
        v24 = *((_QWORD *)&KeNodeBlock + v22);
        result = *(unsigned __int16 *)(v24 + 146);
        if( (_WORD)result == *(_WORD *)(v24 + 148) )
        {
          v25 = 0;
          v26 = i * result;
          v56 = i * result;
          if( i )
          {
            v27 = *((_QWORD *)&KeNodeBlock + v22);
            do
            {
              v28 = *((_QWORD *)&KeNodeBlock + v25);
              result = *(unsigned __int16 *)(v28 + 146);
              if( (_WORD)result == *(_WORD *)(v28 + 148) )
              {
                v29 = KiActualNodeCost;
                v30 = *(unsigned __int16 *)(v28 + 146);
                result = (unsigned int)(v26 + result);
                v31 = (unsigned int)result;
                if( *(_QWORD *)&KiActualNodeCost[8 * result] == -1i64 )
                {
                  v32 = *(unsigned __int16 *)(v27 + 146);
                  v33 = (unsigned int)(v32 + i * v30);
                  v34 = *(_QWORD *)&KiActualNodeCost[8 * v33];
                  if( v34 == -1 )
                  {
                    result = v30 + i * v32;
                    v35 = *(_DWORD *)(*(_QWORD *)KeNodeDistance + 4i64 * (int)result);
                    if( v35 != 1
                      || (result = (int)v33, v35 = *(_DWORD *)(*(_QWORD *)KeNodeDistance + 4i64 * (int)v33), v35 != 1) )
                    {
                      if( !v21 )
                      {
                        result = KiGetHalNumaConversionFactor(&v59);
                        v21 = v59;
                        v20 = result;
                      }
                      if( v21 == 2 )
                      {
                        v36 = v20 * v35;
                        result = 0x47AE147AE147AE15i64 * v36;
                        v37 = v36 / 0x64;
                      }
                      else if( v21 == 3 )
                      {
                        result = 100 * (unsigned __int64)v35 / v20;
                        v37 = result;
                      }
                      else
                      {
                        v37 = -1i64;
                      }
                      *(_QWORD *)&v29[8 * v31] = v37;
                    }
                  }
                  else
                  {
                    *(_QWORD *)&KiActualNodeCost[8 * result] = v34;
                  }
                  v26 = v56;
                }
              }
              v19 = KeNumberNodes;
              ++v25;
              i = (unsigned __int16)KeNumberNodes;
            }
            while( v25 < (unsigned __int16)KeNumberNodes );
            v22 = v58;
          }
        }
        ++v22;
        i = v19;
      }
      v38 = v19;
      v39 = 0;
      if( v19 )
      {
        do
        {
          v40 = 0;
          v41 = v38 * *(unsigned __int16 *)(*((_QWORD *)&KeNodeBlock + v39) + 148i64);
          if( v38 )
          {
            v42 = v66;
            v43 = &KeNodeBlock;
            do
            {
              v44 = *(_QWORD *)v43;
              *((_DWORD *)v42 - 2) = v40;
              if( v44 )
              {
                v45 = *(_QWORD *)&KiActualNodeCost[8 * v41 + 8 * *(unsigned __int16 *)(v44 + 146)];
                *v42 = v45;
                if( !v45 )
                  *v42 = 1i64;
              }
              else
              {
                *v42 = -1i64;
              }
              ++v40;
              v43 += 8;
              v42 += 2;
            }
            while( v40 < v38 );
          }
          v46 = (unsigned __int16)KeNumberNodes;
          v66[2 * v39] = 0i64;
          result = (INT64)qsort((WCHAR *)Base, v46, (const WCHAR *)0x10, MiNodeCostSort);
          v47 = KeNumberNodes;
          v48 = 0;
          for( j = (unsigned __int16)KeNumberNodes;
                v48 < (unsigned __int16)KeNumberNodes;
                j = (unsigned __int16)KeNumberNodes )
          {
            v50 = 2i64 * v48;
            v51 = v48 + v39 * j;
            ++v48;
            v52 = Base[4 * v50];
            result = (INT64)KiNodeGraph;
            *(_WORD *)&KiNodeGraph[2 * v51] = v52;
            v47 = KeNumberNodes;
          }
          ++v39;
          v38 = v47;
        }
        while( v39 < v47 );
      }
      goto LABEL_2;
    }
    while( 1 )
    {
      v7 = *((_QWORD *)&KeNodeBlock + v5);
      v8 = *(_WORD *)(v7 + 146);
      if( v8 == *(_WORD *)(v7 + 148) )
      {
        if( *(_QWORD *)(v7 + 136) )
        {
          v9 = v5;
        }
        else
        {
          v9 = 0;
          if( v6 )
          {
            v10 = &KeNodeBlock;
            do
            {
              v7 = *(_QWORD *)v10;
              if( *(_WORD *)(*(_QWORD *)v10 + 148i64) == v8 && *(_QWORD *)(v7 + 136) )
                break;
              ++v9;
              v10 += 8;
            }
            while( v9 < v6 );
          }
          if( v9 == v6 )
            goto LABEL_32;
        }
        Affinity_8.Group = *(_WORD *)(v7 + 144);
        Affinity_8.Mask = *(_QWORD *)(v7 + 136) & (*(_QWORD *)(v7 + 136) ^ (*(_QWORD *)(v7 + 136) - 1i64));
        if( v4 )
        {
          p_PreviousAffinity = 0i64;
        }
        else
        {
          v55 = 1;
          p_PreviousAffinity = &PreviousAffinity;
        }
        KeSetSystemGroupAffinityThread(&Affinity_8, p_PreviousAffinity);
        v12 = 0;
        if( KeNumberNodes )
        {
          do
          {
            LODWORD(Flags) = 7;
            LODWORD(Priority) = v12;
            PartitionNodePagesForMdl = MmAllocatePartitionNodePagesForMdlEx(
                                         0i64,
                                         Affinity,
                                         0i64,
                                         0x1000ui64,
                                         MmNonCached,
                                         Priority,
                                         Flags,
                                         0i64);
            v14 = PartitionNodePagesForMdl;
            if( PartitionNodePagesForMdl )
            {
              v15 = (char *)MmMapLockedPagesSpecifyCache(PartitionNodePagesForMdl, 0, MmNonCached, 0i64, 0, 0x40000020u);
              if( v15 )
              {
                CurrentIrql = KeGetCurrentIrql();
                __writecr8(2ui64);
                v17 = v15 + 4096;
                v60 = __rdtsc();
                while( v15 < v17 )
                  v15 += 8;
                v63 = __rdtsc();
                v18 = v63;
                __writecr8(CurrentIrql);
                *(_QWORD *)&KiActualNodeCost[8 * v12 + 8 * v9 * (unsigned __int16)KeNumberNodes] = v18 - v60;
              }
              MiFreePagesFromMdl(v14, 0i64);
              ExFreePoolWithTag(v14, 0);
            }
            ++v12;
          }
          while( v12 < (unsigned __int16)KeNumberNodes );
          v5 = v57;
        }
        v4 = v55;
      }
LABEL_32:
      result = (unsigned __int16)KeNumberNodes;
      v57 = ++v5;
      v6 = (unsigned __int16)KeNumberNodes;
      if( v5 >= (unsigned __int16)KeNumberNodes )
      {
        if( v4 == 1 )
          KeRevertToUserGroupAffinityThread(&PreviousAffinity);
        goto LABEL_35;
      }
    }
  }
  return result;
}

Referenced by:

KeInitSystem