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