KiComputeNumaCosts

VOID __stdcall KiComputeNumaCosts(){
  __int64 v0; 
  VOID **PoolWithTag; 
  int v2; 
  unsigned int v3; 
  unsigned int v4; 
  __int64 v5; 
  __int16 v6; 
  unsigned int v7; 
  __int64 *v8; 
  _GROUP_AFFINITY *p_PreviousAffinity; 
  unsigned int v10; 
  _MDL *PartitionNodePagesForMdl; 
  _MDL *v12; 
  UINT64 v13; 
  char *v14; 
  unsigned __int8 CurrentIrql; 
  char *v16; 
  unsigned __int64 v17; 
  unsigned __int16 v18; 
  UINT64 v19; 
  int v20; 
  unsigned int v21; 
  int i; 
  __int64 v23; 
  int v24; 
  unsigned int v25; 
  int v26; 
  __int64 v27; 
  __int64 v28; 
  int v29; 
  __int64 v30; 
  int v31; 
  __int64 v32; 
  __int64 v33; 
  int v34; 
  __int64 v35; 
  __int64 v36; 
  unsigned int v37; 
  UINT64 HalNumaConversionFactor; 
  unsigned __int64 v39; 
  unsigned int v40; 
  unsigned int v41; 
  unsigned int v42; 
  int v43; 
  __int64 *v44; 
  __int64 *v45; 
  __int64 v46; 
  __int64 v47; 
  UINT64 v48; 
  unsigned __int16 v49; 
  unsigned int v50; 
  int j; 
  __int64 v52; 
  __int64 v53; 
  INT64 *CacheType; 
  UINT64 IdealNode; 
  UINT64 Flags; 
  int v57; 
  int v58; 
  unsigned int v59; 
  unsigned int v60; 
  INT64 v61; 
  unsigned __int64 v62; 
  _LARGE_INTEGER Affinity; 
  _GROUP_AFFINITY Affinity_8; 
  unsigned __int64 v65; 
  _GROUP_AFFINITY PreviousAffinity; 
  __int16 Base[4]; 
  __int64 v68[127]; 

  PreviousAffinity = 0i64;
  if( (unsigned __int16)KeNumberNodes > 1u )
  {
    v0 = (unsigned __int16)KeNumberNodes * (unsigned int)(unsigned __int16)KeNumberNodes;
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 10 * v0, 1666082123i64);
    *(&KiSwapEvent + 58) = PoolWithTag;
    if( PoolWithTag )
    {
      *(&KiSwapEvent + 51) = &PoolWithTag[v0];
      if( (_DWORD)v0 )
        memset(PoolWithTag, 0xFFu, 8 * v0);
      Affinity.QuadPart = -1i64;
      v2 = 0;
      v57 = 0;
      v3 = 0;
      v59 = 0;
      v4 = (unsigned __int16)KeNumberNodes;
      Affinity_8 = 0i64;
      if( KeNumberNodes )
      {
        while( 1 )
        {
          v5 = KeNodeBlock[v3];
          v6 = *(_WORD *)(v5 + 146);
          if( v6 == *(_WORD *)(v5 + 148) )
          {
            if( *(_QWORD *)(v5 + 136) )
            {
              v7 = v3;
            }
            else
            {
              v7 = 0;
              if( v4 )
              {
                v8 = KeNodeBlock;
                do
                {
                  v5 = *v8;
                  if( *(_WORD *)(*v8 + 148) == v6 && *(_QWORD *)(v5 + 136) )
                    break;
                  ++v7;
                  ++v8;
                }
                while( v7 < v4 );
              }
              if( v7 == v4 )
                goto LABEL_31;
            }
            Affinity_8.Group = *(_WORD *)(v5 + 144);
            Affinity_8.Mask = *(_QWORD *)(v5 + 136) & (*(_QWORD *)(v5 + 136) ^ (*(_QWORD *)(v5 + 136) - 1i64));
            if( v2 )
            {
              p_PreviousAffinity = 0i64;
            }
            else
            {
              v57 = 1;
              p_PreviousAffinity = &PreviousAffinity;
            }
            KeSetSystemGroupAffinityThread(&Affinity_8, p_PreviousAffinity);
            v10 = 0;
            if( KeNumberNodes )
            {
              do
              {
                LODWORD(Flags) = 7;
                LODWORD(IdealNode) = v10;
                PartitionNodePagesForMdl = MmAllocatePartitionNodePagesForMdlEx(
                                             0i64,
                                             Affinity,
                                             0i64,
                                             0x1000ui64,
                                             MmNonCached,
                                             IdealNode,
                                             Flags,
                                             0i64);
                v12 = PartitionNodePagesForMdl;
                if( PartitionNodePagesForMdl )
                {
                  LODWORD(IdealNode) = 1073741856;
                  LODWORD(CacheType) = 0;
                  v14 = (char *)MmMapLockedPagesSpecifyCache(
                                  PartitionNodePagesForMdl,
                                  0,
                                  MmNonCached,
                                  0i64,
                                  (UINT64)CacheType,
                                  IdealNode);
                  if( v14 )
                  {
                    CurrentIrql = KeGetCurrentIrql();
                    __writecr8(2ui64);
                    v16 = v14 + 4096;
                    v62 = __rdtsc();
                    while( v14 < v16 )
                      v14 += 8;
                    v65 = __rdtsc();
                    v17 = v65;
                    __writecr8(CurrentIrql);
                    *(_QWORD *)(*(&KiSwapEvent + 58) + 8i64 * (v10 + v7 * (unsigned __int16)KeNumberNodes)) = v17 - v62;
                  }
                  MiFreePagesFromMdl(v12, 0i64, v13);
                  ExFreePoolWithTag(v12, 0);
                }
                ++v10;
              }
              while( v10 < (unsigned __int16)KeNumberNodes );
              v3 = v59;
            }
            v2 = v57;
          }
LABEL_31:
          v59 = ++v3;
          v4 = (unsigned __int16)KeNumberNodes;
          if( v3 >= (unsigned __int16)KeNumberNodes )
          {
            if( v2 == 1 )
              KeRevertToUserGroupAffinityThread(&PreviousAffinity);
            break;
          }
        }
      }
      v18 = KeNumberNodes;
      v19 = 0i64;
      LODWORD(v61) = 0;
      v20 = 0;
      v60 = 0;
      v21 = 0;
      for( i = (unsigned __int16)KeNumberNodes; v21 < v18; v60 = v21 )
      {
        v23 = KeNodeBlock[v21];
        v24 = *(unsigned __int16 *)(v23 + 146);
        if( (_WORD)v24 == *(_WORD *)(v23 + 148) )
        {
          v25 = 0;
          v26 = i * v24;
          v58 = i * v24;
          if( i )
          {
            v27 = KeNodeBlock[v21];
            do
            {
              v28 = KeNodeBlock[v25];
              v29 = *(unsigned __int16 *)(v28 + 146);
              if( (_WORD)v29 == *(_WORD *)(v28 + 148) )
              {
                v30 = *(&KiSwapEvent + 58);
                v31 = *(unsigned __int16 *)(v28 + 146);
                v32 = (unsigned int)(v26 + v29);
                v33 = (unsigned int)v32;
                if( *(_QWORD *)(*(&KiSwapEvent + 58) + 8 * v32) == -1i64 )
                {
                  v34 = *(unsigned __int16 *)(v27 + 146);
                  v35 = (unsigned int)(v34 + i * v31);
                  v36 = *(_QWORD *)(*(&KiSwapEvent + 58) + 8 * v35);
                  if( v36 == -1 )
                  {
                    v37 = *((_DWORD *)KeNodeDistance + v31 + i * v34);
                    if( v37 != 1 || (v37 = *((_DWORD *)KeNodeDistance + (int)v35), v37 != 1) )
                    {
                      if( !v20 )
                      {
                        HalNumaConversionFactor = KiGetHalNumaConversionFactor(&v61);
                        v20 = v61;
                        v19 = HalNumaConversionFactor;
                      }
                      if( v20 == 2 )
                      {
                        v39 = v19 * v37 / 0x64;
                      }
                      else if( v20 == 3 )
                      {
                        v39 = 100 * (unsigned __int64)v37 / v19;
                      }
                      else
                      {
                        v39 = -1i64;
                      }
                      *(_QWORD *)(v30 + 8 * v33) = v39;
                    }
                  }
                  else
                  {
                    *(_QWORD *)(*(&KiSwapEvent + 58) + 8 * v32) = v36;
                  }
                  v26 = v58;
                }
              }
              v18 = KeNumberNodes;
              ++v25;
              i = (unsigned __int16)KeNumberNodes;
            }
            while( v25 < (unsigned __int16)KeNumberNodes );
            v21 = v60;
          }
        }
        ++v21;
        i = v18;
      }
      v40 = v18;
      v41 = 0;
      if( v18 )
      {
        do
        {
          v42 = 0;
          v43 = v40 * *(unsigned __int16 *)(KeNodeBlock[v41] + 148);
          if( v40 )
          {
            v44 = v68;
            v45 = KeNodeBlock;
            do
            {
              v46 = *v45;
              *((_DWORD *)v44 - 2) = v42;
              if( v46 )
              {
                v47 = *(_QWORD *)(*(&KiSwapEvent + 58) + 8i64 * (v43 + (unsigned int)*(unsigned __int16 *)(v46 + 146)));
                *v44 = v47;
                if( !v47 )
                  *v44 = 1i64;
              }
              else
              {
                *v44 = -1i64;
              }
              ++v42;
              ++v45;
              v44 += 2;
            }
            while( v42 < v40 );
          }
          v48 = (unsigned __int16)KeNumberNodes;
          v68[2 * v41] = 0i64;
          qsort((UINT64)Base, v48, 0x10ui64, (INT64)MiNodeCostSort, CacheType, IdealNode, Flags);
          v49 = KeNumberNodes;
          v50 = 0;
          for( j = (unsigned __int16)KeNumberNodes;
                v50 < (unsigned __int16)KeNumberNodes;
                j = (unsigned __int16)KeNumberNodes )
          {
            v52 = 2i64 * v50;
            v53 = v50 + v41 * j;
            ++v50;
            *(_WORD *)(*(&KiSwapEvent + 51) + 2 * v53) = Base[4 * v52];
            v49 = KeNumberNodes;
          }
          ++v41;
          v40 = v49;
        }
        while( v41 < v49 );
      }
    }
  }
}

Referenced by:

KeInitSystem