MiDemotePfnListChain

INT64 __fastcall MiDemotePfnListChain(INT64 a1, INT64 a2){
  int v2; 
  INT64 result; 
  char *v5; 
  __int64 v6; 
  UINT64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  INT64 v10; 
  unsigned __int8 CurrentIrql; 
  unsigned int v12; 
  unsigned __int64 v13; 
  UINT64 BitsMustBeChanged; 
  __int64 v15; 
  char v16; 
  int v17; 
  int v18; 
  v17 = a2;
  v2 = a2;
  result = (unsigned int)(a2 - 1);
  do
  {
    v5 = *(char **)(a1 + 8 * result);
    v6 = (unsigned int)result;
    while( !v5 )
    {
      if( !(_DWORD)v6 )
        return result;
      v6 = (unsigned int)(v6 - 1);
      v5 = *(char **)(a1 + 8i64 * (unsigned int)v6);
    }
    v7 = MiLargePageSizes[v6];
    *(_QWORD *)(a1 + 8 * v6) = *(_QWORD *)v5;
    v8 = v7;
    if( (_DWORD)v6 == 1 )
    {
      LODWORD(BitsMustBeChanged) = 1;
      MiUpdateLargePageBitMap(
        *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64)),
        (v5 - (char *)MmGetPfnDb()) / 48,
        v7,
        0i64,
        BitsMustBeChanged);
      v8 = MiLargePageSizes[v6];
    }
    v16 = 2 - v6;
    v18 = v6 + 1;
    v9 = MiLargePageSizes[(unsigned int)(v6 + 1)];
    v15 = (unsigned int)(v6 + 1);
    v10 = (INT64)&v5[48 * v7];
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v12 = 0;
    if( v8 / v9 )
    {
      v13 = v8 / v9;
      do
      {
        v10 -= 48 * v9;
        MiLockPageAtDpc(v10);
        if( v9 == 1 )
          MiSetResidentPageMemberInPfn(v10, 0i64);
        else
          *(_BYTE *)(v10 + 39) ^= (v16 ^ *(_BYTE *)(v10 + 39)) & 3;
        if( (char *)v10 != v5 )
        {
          MiSetPfnPageState(v10, 5);
          *(_QWORD *)(v10 + 16) = *((_QWORD *)v5 + 2);
        }
        _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
        ++v12;
        *(_QWORD *)v10 = *(_QWORD *)(a1 + 8 * v15);
        *(_QWORD *)(a1 + 8 * v15) = v10;
      }
      while( v12 < v13 );
      v2 = v17;
    }
    __writecr8(CurrentIrql);
    result = (unsigned int)(v2 - 1);
  }
  while( v18 != v2 );
  return result;
}

Referenced by:

MiCommitExistingVad
MiMakeLargePageTable
MiMapUserLargePages