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