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