MiTimeSingleLargePageZero
VOID __fastcall MiTimeSingleLargePageZero(INT64 a1){
INT64 v1;
unsigned int v2;
unsigned int i;
__int64 v4;
unsigned int v5;
__int64 v6;
__int64 v7;
unsigned __int64 Mask;
unsigned __int64 v9;
unsigned int v10;
unsigned __int8 v11;
unsigned __int64 v12;
unsigned int FirstSetRightGroupAffinity;
__int64 v14;
UINT64 v15;
unsigned __int64 v16;
__int64 v17;
unsigned __int64 v18;
_QWORD *v19;
__int64 v20;
unsigned __int64 v21;
bool v22;
_QWORD *v23;
UINT64 v24;
unsigned int v25;
unsigned int v26;
struct _GROUP_AFFINITY GroupAffinity;
INT64 v28;
struct _GROUP_AFFINITY Affinity;
__int64 v30;
__int64 v31;
struct _GROUP_AFFINITY PreviousAffinity;
v28 = a1;
v1 = a1;
v2 = dword_140C4DC24;
PreviousAffinity = 0i64;
v25 = dword_140C4DC24;
for( i = 0; i < (unsigned __int16)KeNumberNodes; v1 = v28 )
{
v4 = *(_QWORD *)(v1 + 16) + 4544i64 * i;
v30 = v4;
v5 = *(unsigned __int16 *)(v4 + 4488) / v2;
GroupAffinity = *(struct _GROUP_AFFINITY *)(v4 + 4472);
if( !v5 )
v5 = 1;
v26 = v5;
LODWORD(v6) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v31 = v6;
v7 = v6;
if( v6 )
{
Mask = GroupAffinity.Mask;
Affinity = 0i64;
v9 = 0i64;
*(_QWORD *)(v4 + 4400) = v6;
v10 = 0;
while( Mask )
{
v11 = 0;
Affinity = 0i64;
if( v25 )
{
v12 = Affinity.Mask;
do
{
if( (v10 & 1) != 0 )
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(&GroupAffinity);
else
FirstSetRightGroupAffinity = KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
v14 = (__int64)*(&KiProcessorBlock + FirstSetRightGroupAffinity);
Affinity.Group = *(unsigned __int8 *)(v14 + 208);
v12 |= 1i64 << *(_BYTE *)(v14 + 209);
GroupAffinity.Mask &= ~v12;
if( !GroupAffinity.Mask )
break;
++v11;
}
while( v11 < v25 );
v4 = v30;
v7 = v31;
Affinity.Mask = v12;
Mask = GroupAffinity.Mask;
}
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
v15 = MiTimeSingleLargePageZeroWorker(v28, i);
v9 += v15;
*(_QWORD *)(v7 + 8i64 * v10) = v15;
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
if( ++v10 >= 3 )
{
v17 = v10 - 3;
v18 = 0i64;
if( (unsigned int)v17 < v10 )
{
v19 = (_QWORD *)(v7 + 8 * v17);
v20 = 3i64;
do
{
v18 += *v19++;
--v20;
}
while( v20 );
}
v21 = v18 / 3;
v22 = (_DWORD)v17 == v10;
if( (unsigned int)v17 < v10 )
{
v23 = (_QWORD *)(v7 + 8 * v17);
do
{
if( *v23 < v21 - v21 / 0xA )
break;
if( *v23 > v21 / 0xA + v21 )
break;
LODWORD(v17) = v17 + 1;
++v23;
}
while( (unsigned int)v17 < v10 );
v22 = (_DWORD)v17 == v10;
}
if( v22 )
{
dword_140C2A03C += v26 / v25 - v10;
v9 = v21 * v10;
break;
}
}
if( v10 == v26 )
break;
}
v16 = v10;
v1 = v28;
*(_QWORD *)(v4 + 4456) = v9 / v16;
}
if( !*(_QWORD *)(v4 + 4400) )
{
GroupAffinity = *(struct _GROUP_AFFINITY *)(v4 + 4472);
KeSetSystemGroupAffinityThread(&GroupAffinity, &PreviousAffinity);
v24 = MiTimeSingleLargePageZeroWorker(v1, i);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
*(_QWORD *)(v4 + 4456) = v24;
}
++i;
v2 = v25;
}
}Referenced by:
MiZeroPageCalibrate