MiAddZeroingThreads
NTSTATUS __stdcall MiAddZeroingThreads(_MI_ZERO_THREAD_CONTEXT *ThreadContext){
__int64 v1;
int v2;
unsigned int v3;
__int64 v5;
unsigned int v6;
unsigned int v7;
__int64 v8;
unsigned int FirstSetRightGroupAffinity;
int v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
int v15;
__int64 v16;
_GROUP_AFFINITY GroupAffinity;
v1 = *((_QWORD *)ThreadContext + 29);
GroupAffinity = 0i64;
v2 = *(_DWORD *)(v1 + 164);
v3 = *(_DWORD *)(v1 + 156);
if( v2 == *(_DWORD *)(v1 + 160) )
{
++dword_140C2A024;
return 3;
}
if( v3 == v2 )
{
++MiZeroThreadStats;
return 4;
}
v5 = *(&stru_140C4DB30 + 61);
v6 = 0;
v7 = *(_DWORD *)(v1 + 156);
if( !v3 )
goto LABEL_16;
v8 = 0i64;
while( (*(_BYTE *)(v8 + *(_QWORD *)(v1 + 144) + 4) & 1) == 0 )
{
LABEL_15:
++v6;
v8 += 40i64;
if( v6 >= v3 )
goto LABEL_16;
}
GroupAffinity = *(_GROUP_AFFINITY *)(*(_QWORD *)(v8 + *(_QWORD *)(v1 + 144) + 8) + 280i64);
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity((INT64)&GroupAffinity);
v10 = 0;
if( (_DWORD)v5 )
{
v11 = v5;
do
{
v12 = (__int64)*(&KiProcessorBlock + FirstSetRightGroupAffinity);
v13 = *(_QWORD *)(v12 + 8);
v14 = *(_QWORD *)(v12 + 24);
v15 = v10 + 1;
if( v13 != v14 )
v15 = v10;
++FirstSetRightGroupAffinity;
v10 = v15;
--v11;
}
while( v11 );
}
if( v10 != (_DWORD)v5 )
{
if( v10 )
v7 = v6;
goto LABEL_15;
}
if( v6 != v3 )
{
++*(_DWORD *)(v1 + 276);
LABEL_19:
v16 = *(_QWORD *)(v1 + 144);
++*(_DWORD *)(v1 + 164);
*(_BYTE *)(v16 + 40i64 * v6 + 4) &= ~1u;
KeSetEvent((PRKEVENT)(v16 + 40i64 * v6 + 16), 0, 0);
return 0;
}
LABEL_16:
v6 = v7;
if( v7 != v3 )
{
++*(_DWORD *)(v1 + 280);
goto LABEL_19;
}
++*(_DWORD *)(v1 + 284);
return 2;
}Referenced by:
MiReassessZeroThreads