MiMirrorGatherBrownPages

__int64 __fastcall MiMirrorGatherBrownPages(UINT64 *a1, __int64 a2, int a3, unsigned int a4){
  __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned int v8; 
  _QWORD *v9; 
  unsigned int v10; 
  __int64 v11; 
  _MMPFN *PfnDb; 
  $559D8309DABD45803AD694472C7FC28A *v13; 
  int v14; 
  __int64 *v15; 
  __int64 v16; 
  _MMPFN *v17; 
  __int64 i; 
  $559D8309DABD45803AD694472C7FC28A *v19; 
  __int64 result; 
  unsigned __int64 bf_0; 
  __int64 v22; 
  _MMPFN *v23; 
  $559D8309DABD45803AD694472C7FC28A *v24; 
  $559D8309DABD45803AD694472C7FC28A *v25; 
  UINT64 PhaseNumber; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  unsigned int v28; 
  int v30; 
  unsigned int v31; 

  v31 = a4;
  v4 = a3;
  v30 = 0;
  PhaseNumber = *a1;
  v5 = a4;
  v6 = 16i64;
  v7 = a2;
  v8 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( a3 <= 4i64 )
  {
    while( 1 )
    {
      v9 = *(_QWORD **)(v7 + 8 * v4 + 4216);
      v10 = v5;
      v28 = v5;
      if( v4 <= 1 )
        v9 = (_QWORD *)(*(_QWORD *)(v7 + 8 * v4 + 2176) + 40i64 * v8);
      if( v4 == 2 )
        v9 = (_QWORD *)(v7 + 40i64 * v5 + 2432);
      if( v4 != 3 )
        goto LABEL_7;
      if( *v9 != *(_QWORD *)(v7 + 7600) )
        break;
LABEL_22:
      if( ++v4 > 4 )
        goto LABEL_23;
    }
    v9 = (_QWORD *)(v7 + 40i64 * v5 + 3456);
LABEL_7:
    KeAcquireInStackQueuedSpinLock(v9 + 4, &LockHandle);
    if( *v9 )
    {
      v11 = v9[2];
      PfnDb = MmGetPfnDb();
      do
      {
        v13 = ($559D8309DABD45803AD694472C7FC28A *)&PfnDb[v11];
        LOBYTE(v14) = MiIsPfnFileOnly((INT64)v13);
        if( !v14 )
        {
          if( v4 == 2 && MiIsDecayPfn(v11) == 1 )
          {
            bf_0 = v13[2]._bf_0;
            if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
              bf_0 &= ~*(&stru_140C4DB30 + 42);
            v22 = (bf_0 >> 12) & 0xFFFFFFFFFi64;
            if( v22 != v11 )
            {
              v23 = MmGetPfnDb();
              do
              {
                v24 = ($559D8309DABD45803AD694472C7FC28A *)&v23[v22];
                MiMirrorAddPagesToBrownList(v22, 1ui64);
                v22 = v24->_bf_0 & 0xFFFFFFFFFi64;
              }
              while( v22 != v11 );
              PfnDb = MmGetPfnDb();
              v6 = 16i64;
            }
          }
          else
          {
            MiMirrorAddPagesToBrownList(v11, 1ui64);
          }
        }
        v11 = v13->_bf_0 & 0xFFFFFFFFFi64;
      }
      while( v11 != 0xFFFFFFFFFi64 );
      v7 = a2;
      v5 = v31;
      v8 = v30;
      v10 = v28;
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( v4 <= 1 )
    {
      v30 = ++v8;
      if( v8 >= *(&stru_140C4DB30 + 67) )
      {
        v30 = 0;
        v8 = 0;
        if( v4 == 1 )
          MiMirrorNodeLargePages(PhaseNumber, (_MM_MIRROR_DISPATCH *)v7, 0);
      }
      else
      {
        --v4;
      }
    }
    else if( v4 == 2 )
    {
      ++v5;
      if( v10 == 7 )
        v5 = 0;
      if( v10 != 7 )
        v4 = 1i64;
      v31 = v5;
    }
    else if( v4 == 3 )
    {
      v31 = ++v5;
      if( v5 != 16 )
        v4 = 2i64;
    }
    goto LABEL_22;
  }
LABEL_23:
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v7 + 7520), &LockHandle);
  v15 = (__int64 *)(v7 + 2832);
  do
  {
    v16 = *v15;
    v17 = MmGetPfnDb();
    while( v16 != 0xFFFFFFFFFi64 )
    {
      v25 = ($559D8309DABD45803AD694472C7FC28A *)&v17[v16];
      MiMirrorAddPagesToBrownList(v16, 1ui64);
      v16 = v25->_bf_0 & 0xFFFFFFFFFi64;
    }
    v15 += 5;
    --v6;
  }
  while( v6 );
  for( i = *(_QWORD *)(v7 + 2768); i != 0xFFFFFFFFFi64; i = v19->_bf_0 & 0xFFFFFFFFFi64 )
  {
    v19 = ($559D8309DABD45803AD694472C7FC28A *)&v17[i];
    MiMirrorAddPagesToBrownList(i, 1ui64);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

MiMirrorBrownPhase