MiMirrorGatherBrownPages

INT64 __fastcall MiMirrorGatherBrownPages(INT64 *a1, _QWORD *a2, INT64 a3, UINT64 a4){
  __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  _QWORD *v7; 
  unsigned int v8; 
  _QWORD *v9; 
  unsigned int v10; 
  __int64 v11; 
  _MMPFN *PfnDb; 
  _QWORD *v13; 
  __int64 *v14; 
  __int64 v15; 
  _MMPFN *v16; 
  __int64 i; 
  _QWORD *v18; 
  INT64 result; 
  unsigned __int64 v20; 
  __int64 v21; 
  _MMPFN *v22; 
  _QWORD *v23; 
  _QWORD *v24; 
  INT64 v25; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  unsigned int v27; 
  unsigned int v29; 
  int v30; 
  v30 = a4;
  v4 = (int)a3;
  v29 = 0;
  v25 = *a1;
  v5 = a4;
  v6 = 16i64;
  v7 = a2;
  v8 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( (int)a3 <= 4i64 )
  {
    while( 1 )
    {
      v9 = (_QWORD *)v7[v4 + 527];
      v10 = v5;
      v27 = v5;
      if( v4 <= 1 )
        v9 = (_QWORD *)(v7[v4 + 272] + 40i64 * v8);
      if( v4 == 2 )
        v9 = &v7[5 * v5 + 304];
      if( v4 != 3 )
        goto LABEL_7;
      if( *v9 != v7[950] )
        break;
LABEL_22:
      if( ++v4 > 4 )
        goto LABEL_23;
    }
    v9 = &v7[5 * v5 + 432];
LABEL_7:
    KeAcquireInStackQueuedSpinLock(v9 + 4, &LockHandle);
    if( *v9 )
    {
      v11 = v9[2];
      PfnDb = MmGetPfnDb();
      do
      {
        v13 = (_QWORD *)((char *)PfnDb + 48 * v11);
        if( !MiIsPfnFileOnly((INT64)v13) )
        {
          if( v4 == 2 && (unsigned int)MiIsDecayPfn(v11) == 1 )
          {
            v20 = v13[2];
            if( qword_140C4DC80 && (v20 & 0x10) == 0 )
              v20 &= ~qword_140C4DC80;
            v21 = (v20 >> 12) & 0xFFFFFFFFFi64;
            if( v21 != v11 )
            {
              v22 = MmGetPfnDb();
              do
              {
                v23 = (_QWORD *)((char *)v22 + 48 * v21);
                MiMirrorAddPagesToBrownList(v21, 1ui64);
                v21 = *v23 & 0xFFFFFFFFFi64;
              }
              while( v21 != v11 );
              PfnDb = MmGetPfnDb();
              v6 = 16i64;
            }
          }
          else
          {
            MiMirrorAddPagesToBrownList(v11, 1ui64);
          }
        }
        v11 = *v13 & 0xFFFFFFFFFi64;
      }
      while( v11 != 0xFFFFFFFFFi64 );
      v7 = a2;
      v5 = v30;
      v8 = v29;
      v10 = v27;
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( v4 <= 1 )
    {
      v29 = ++v8;
      if( v8 >= dword_140C4DC3C )
      {
        v29 = 0;
        v8 = 0;
        if( v4 == 1 )
          MiMirrorNodeLargePages(v25, (INT64)v7, 0i64);
      }
      else
      {
        --v4;
      }
    }
    else if( v4 == 2 )
    {
      ++v5;
      if( v10 == 7 )
        v5 = 0;
      if( v10 != 7 )
        v4 = 1i64;
      v30 = v5;
    }
    else if( v4 == 3 )
    {
      v30 = ++v5;
      if( v5 != 16 )
        v4 = 2i64;
    }
    goto LABEL_22;
  }
LABEL_23:
  KeAcquireInStackQueuedSpinLock(v7 + 940, &LockHandle);
  v14 = v7 + 354;
  do
  {
    v15 = *v14;
    v16 = MmGetPfnDb();
    while( v15 != 0xFFFFFFFFFi64 )
    {
      v24 = (_QWORD *)((char *)v16 + 48 * v15);
      MiMirrorAddPagesToBrownList(v15, 1ui64);
      v15 = *v24 & 0xFFFFFFFFFi64;
    }
    v14 += 5;
    --v6;
  }
  while( v6 );
  for( i = v7[346]; i != 0xFFFFFFFFFi64; i = *v18 & 0xFFFFFFFFFi64 )
  {
    v18 = (_QWORD *)((char *)v16 + 48 * i);
    MiMirrorAddPagesToBrownList(i, 1ui64);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

MiMirrorBrownPhase