MiTimeSingleLargePageZero
VOID __stdcall MiTimeSingleLargePageZero(INT64 a1){
INT64 v1;
unsigned int v2;
unsigned int i;
__int64 v4;
unsigned int v5;
VOID *Pool;
__int64 v7;
unsigned __int64 Mask;
unsigned __int64 v9;
unsigned int v10;
unsigned __int8 v11;
unsigned __int64 v12;
unsigned int FirstSetRightGroupAffinity;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
__int64 v17;
unsigned __int64 v18;
_QWORD *v19;
__int64 v20;
unsigned __int64 v21;
bool v22;
_QWORD *v23;
__int64 v24;
__int64 v25;
unsigned int v26;
unsigned int v27;
_GROUP_AFFINITY GroupAffinity;
INT64 v29;
_GROUP_AFFINITY Affinity;
__int64 v31;
__int64 v32;
_GROUP_AFFINITY PreviousAffinity;
v29 = a1;
v1 = a1;
v2 = *(&stru_140C4DB30 + 61);
PreviousAffinity = 0i64;
v26 = *(&stru_140C4DB30 + 61);
for( i = 0; i < (unsigned __int16)KeNumberNodes; v1 = v29 )
{
v4 = *(_QWORD *)(v1 + 16) + 4544i64 * i;
v31 = v4;
v5 = *(unsigned __int16 *)(v4 + 4488) / v2;
GroupAffinity = *(_GROUP_AFFINITY *)(v4 + 4472);
if( !v5 )
v5 = 1;
v27 = v5;
Pool = MiAllocatePool(64i64, 8i64 * v5, 0x20206D4Dui64);
v32 = (__int64)Pool;
v7 = (__int64)Pool;
if( Pool )
{
Mask = GroupAffinity.Mask;
Affinity = 0i64;
v9 = 0i64;
*(_QWORD *)(v4 + 4400) = Pool;
v10 = 0;
while( Mask )
{
v11 = 0;
Affinity = 0i64;
if( v26 )
{
v12 = Affinity.Mask;
do
{
if( (v10 & 1) != 0 )
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity((INT64)&GroupAffinity);
else
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 < v26 );
v4 = v31;
v7 = v32;
Affinity.Mask = v12;
Mask = GroupAffinity.Mask;
}
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
LODWORD(v15) = MiTimeSingleLargePageZeroWorker(v29, 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 += v27 / v26 - v10;
v9 = v21 * v10;
break;
}
}
if( v10 == v27 )
break;
}
v16 = v10;
v1 = v29;
*(_QWORD *)(v4 + 4456) = v9 / v16;
}
if( !*(_QWORD *)(v4 + 4400) )
{
GroupAffinity = *(_GROUP_AFFINITY *)(v4 + 4472);
KeSetSystemGroupAffinityThread(&GroupAffinity, &PreviousAffinity);
LODWORD(v24) = MiTimeSingleLargePageZeroWorker(v1, i);
v25 = v24;
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
*(_QWORD *)(v4 + 4456) = v25;
}
++i;
v2 = v26;
}
}Referenced by:
MiZeroPageCalibrate