MiTimeSingleLargePageZero

VOID __fastcall MiTimeSingleLargePageZero(INT64 a1){
  INT64 v1; 
  unsigned int v2; 
  unsigned int i; 
  __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int64 Mask; 
  unsigned __int64 v9; 
  unsigned int v10; 
  unsigned __int8 v11; 
  unsigned __int64 v12; 
  unsigned int FirstSetRightGroupAffinity; 
  __int64 v14; 
  UINT64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  _QWORD *v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  bool v22; 
  _QWORD *v23; 
  UINT64 v24; 
  unsigned int v25; 
  unsigned int v26; 
  struct _GROUP_AFFINITY GroupAffinity; 
  INT64 v28; 
  struct _GROUP_AFFINITY Affinity; 
  __int64 v30; 
  __int64 v31; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  v28 = a1;
  v1 = a1;
  v2 = dword_140C4DC24;
  PreviousAffinity = 0i64;
  v25 = dword_140C4DC24;
  for( i = 0; i < (unsigned __int16)KeNumberNodes; v1 = v28 )
  {
    v4 = *(_QWORD *)(v1 + 16) + 4544i64 * i;
    v30 = v4;
    v5 = *(unsigned __int16 *)(v4 + 4488) / v2;
    GroupAffinity = *(struct _GROUP_AFFINITY *)(v4 + 4472);
    if( !v5 )
      v5 = 1;
    v26 = v5;
    LODWORD(v6) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    v31 = v6;
    v7 = v6;
    if( v6 )
    {
      Mask = GroupAffinity.Mask;
      Affinity = 0i64;
      v9 = 0i64;
      *(_QWORD *)(v4 + 4400) = v6;
      v10 = 0;
      while( Mask )
      {
        v11 = 0;
        Affinity = 0i64;
        if( v25 )
        {
          v12 = Affinity.Mask;
          do
          {
            if( (v10 & 1) != 0 )
              FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(&GroupAffinity);
            else
              FirstSetRightGroupAffinity = 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 < v25 );
          v4 = v30;
          v7 = v31;
          Affinity.Mask = v12;
          Mask = GroupAffinity.Mask;
        }
        KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
        v15 = MiTimeSingleLargePageZeroWorker(v28, 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 += v26 / v25 - v10;
            v9 = v21 * v10;
            break;
          }
        }
        if( v10 == v26 )
          break;
      }
      v16 = v10;
      v1 = v28;
      *(_QWORD *)(v4 + 4456) = v9 / v16;
    }
    if( !*(_QWORD *)(v4 + 4400) )
    {
      GroupAffinity = *(struct _GROUP_AFFINITY *)(v4 + 4472);
      KeSetSystemGroupAffinityThread(&GroupAffinity, &PreviousAffinity);
      v24 = MiTimeSingleLargePageZeroWorker(v1, i);
      KeRevertToUserGroupAffinityThread(&PreviousAffinity);
      *(_QWORD *)(v4 + 4456) = v24;
    }
    ++i;
    v2 = v25;
  }
}

Referenced by:

MiZeroPageCalibrate