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