MiReduceZeroingThreads
VOID __fastcall MiReduceZeroingThreads(_MI_ZERO_THREAD_CONTEXT *ThreadContext, UINT64 FinalReduction){
int v2;
unsigned int v3;
unsigned int v4;
unsigned int v5;
__int64 v7;
__int64 v8;
__int64 v9;
_GROUP_AFFINITY v10;
unsigned int FirstSetRightGroupAffinity;
int v12;
int v13;
unsigned int i;
__int64 v15;
__int64 v16;
char v17;
int v18;
unsigned int v19;
__int64 v20;
unsigned __int64 v21;
int v22;
unsigned int v23;
__int64 v24;
unsigned int v25;
unsigned __int64 v26;
unsigned int v27;
__int64 v28;
_MI_ZERO_THREAD_CONTEXT *v29;
__int64 v30;
unsigned __int64 v31;
int v32;
int *v33;
int v34;
unsigned int v35;
__int64 v36;
__int64 v37;
bool v38;
int v39;
UINT64 v40;
_GROUP_AFFINITY GroupAffinity;
__int128 v42;
v3 = ThreadContext[39];
v4 = 0;
v5 = *(&stru_140C4DB30 + 61);
v39 = v2;
v40 = FinalReduction;
v42 = 0i64;
GroupAffinity = 0i64;
if( v3 )
{
v7 = 0i64;
v8 = v3;
do
{
v9 = *(_QWORD *)(*((_QWORD *)ThreadContext + 18) + v7 + 8);
v10 = *(_GROUP_AFFINITY *)(v9 + 280);
*(_DWORD *)(v9 + 296) = 0;
GroupAffinity = v10;
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity((INT64)&GroupAffinity);
v12 = 0;
v13 = 0;
for( i = 0; i < v5; ++i )
{
v15 = (__int64)*(&KiProcessorBlock + FirstSetRightGroupAffinity);
if( !v15 )
break;
v16 = *(_QWORD *)(v15 + 8);
if( v16 == *(_QWORD *)(v15 + 24) )
{
++v12;
}
else if( v16 == *(_QWORD *)(v9 + 272) )
{
v13 = 1;
}
++FirstSetRightGroupAffinity;
}
v17 = *(_BYTE *)(*((_QWORD *)ThreadContext + 18) + v7 + 4) & 1;
if( v12 == i )
{
if( v17 )
{
++ThreadContext[60];
++HIDWORD(v42);
*(_DWORD *)(v9 + 296) = 3;
}
else
{
++ThreadContext[61];
}
}
else if( !v17 )
{
if( v13 && (v12 == i - 1 || i == 1) )
{
++ThreadContext[63];
++DWORD2(v42);
*(_DWORD *)(v9 + 296) = 2;
}
else
{
++ThreadContext[62];
++DWORD1(v42);
*(_DWORD *)(v9 + 296) = 1;
}
}
v7 += 40i64;
--v8;
}
while( v8 );
v2 = v39;
FinalReduction = v40;
}
v18 = DWORD1(v42);
if( DWORD1(v42) && HIDWORD(v42) )
{
v19 = 0;
if( DWORD1(v42) > HIDWORD(v42) )
v18 = HIDWORD(v42);
if( v3 )
{
do
{
v20 = *((_QWORD *)ThreadContext + 18);
if( *(_DWORD *)(*(_QWORD *)(v20 + 40i64 * v19 + 8) + 296i64) == 1 )
{
while( *(_DWORD *)(*(_QWORD *)(v20 + 40i64 * v4 + 8) + 296i64) != 3 )
{
if( ++v4 >= v3 )
goto LABEL_29;
}
++ThreadContext[64];
*(_BYTE *)(*((_QWORD *)ThreadContext + 18) + 40i64 * v19 + 4) = *(_BYTE *)(v20 + 40i64 * v19 + 4) | 1;
*(_BYTE *)(*((_QWORD *)ThreadContext + 18) + 40i64 * v4 + 4) &= ~1u;
KeSetEvent((PRKEVENT)(*((_QWORD *)ThreadContext + 18) + 16i64 + 40i64 * v4), 0, 0);
if( !--v18 )
return;
++v4;
}
LABEL_29:
++v19;
}
while( v19 < v3 );
}
}
else
{
if( v2 )
return;
v21 = (unsigned int)ThreadContext[41];
v22 = 1;
if( (unsigned int)v21 <= 1 )
{
++ThreadContext[65];
return;
}
v23 = ThreadContext[40];
if( (unsigned int)v21 > v23 )
{
++ThreadContext[68];
v22 = v21 - v23;
}
else
{
v24 = *(_QWORD *)(FinalReduction + 4464);
if( v24 )
{
v25 = ThreadContext[44];
v26 = 0i64;
v27 = 0;
if( v25 )
{
v28 = v25;
v29 = ThreadContext + 46;
v27 = ThreadContext[44];
do
{
v26 += *(_QWORD *)v29;
v29 += 2;
--v28;
}
while( v28 );
}
v30 = (unsigned int)(v21 - 1);
v31 = *(_QWORD *)(v24 + 8 * v30) / (v26 / v27 / v21);
if( (unsigned int)v31 < (unsigned int)v21 )
{
LODWORD(v30) = *(_QWORD *)(v24 + 8 * v30) / (v26 / v27 / v21);
if( !(_DWORD)v31 )
LODWORD(v30) = 1;
}
v22 = v21 - v30;
if( (_DWORD)v21 == (_DWORD)v30 )
return;
}
}
v32 = 1;
v33 = (int *)&v42 + 1;
do
{
v34 = *v33;
if( *v33 )
{
v35 = 0;
if( v3 )
{
v36 = 0i64;
do
{
v37 = *((_QWORD *)ThreadContext + 18);
if( *(_DWORD *)(*(_QWORD *)(v37 + v36 + 8) + 296i64) == v32 )
{
if( v32 == 1 )
++ThreadContext[66];
else
++ThreadContext[67];
*(_BYTE *)(*((_QWORD *)ThreadContext + 18) + 40i64 * v35 + 4) = *(_BYTE *)(v37 + v36 + 4) | 1;
--ThreadContext[41];
if( !--v22 )
return;
v38 = v34-- == 1;
*v33 = v34;
if( v38 )
break;
}
++v35;
v36 += 40i64;
}
while( v35 < v3 );
}
}
++v32;
++v33;
}
while( v32 <= 2 );
}
}Referenced by:
MiReassessZeroThreads
MiScheduleZeroPageThreads