MiDemotePfnListChain

NTSTATUS __stdcall MiDemotePfnListChain(INT64 a1, INT64 a2){
  int v2; 
  __int64 v3; 
  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 v16; 
  char v17; 
  int v18; 
  int v19; 

  v18 = a2;
  v2 = a2;
  v3 = (unsigned int)(a2 - 1);
  do
  {
    v5 = *(char **)(a1 + 8 * v3);
    v6 = (unsigned int)v3;
    while( !v5 )
    {
      if( !(_DWORD)v6 )
        return v3;
      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 *)(*(&stru_140C4DB30 + 267) + 8 * ((*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64)),
        (v5 - (char *)MmGetPfnDb()) / 48,
        v7,
        0i64,
        BitsMustBeChanged);
      v8 = MiLargePageSizes[v6];
    }
    v17 = 2 - v6;
    v19 = v6 + 1;
    v9 = MiLargePageSizes[(unsigned int)(v6 + 1)];
    v16 = (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) ^= (v17 ^ *(_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 * v16);
        *(_QWORD *)(a1 + 8 * v16) = v10;
      }
      while( v12 < v13 );
      v2 = v18;
    }
    __writecr8(CurrentIrql);
    v3 = (unsigned int)(v2 - 1);
  }
  while( v19 != v2 );
  return v3;
}

Referenced by:

MiCommitExistingVad
MiMakeLargePageTable
MiMapUserLargePages