MiMakeLargePageTable

INT64 __fastcall MiMakeLargePageTable(INT64 a1, volatile INT64 *a2, INT64 a3){
  INT64 v3; 
  unsigned __int64 v5; 
  __int64 v6; 
  UINT64 LeafVa; 
  INT64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  INT64 v11; 
  UINT64 ContainingPageTable; 
  char *v13; 
  UINT64 ValidPte; 
  INT64 result; 
  v3 = *(_QWORD *)(a1 + 168);
  v5 = (int)a3;
  if( (*(_DWORD *)(v3 + 64) & 0x80u) == 0 )
    return 0i64;
  if( (unsigned int)(a3 - 1) > 1 )
    return 0i64;
  LeafVa = MiGetLeafVa((UINT64)a2);
  if( LeafVa < *(_QWORD *)(v6 + 32) )
    return 0i64;
  v8 = 1i64;
  if( v5 > 1 )
  {
    v9 = v5 - 1;
    do
    {
      v8 = (unsigned int)(v8 - 1);
      --v9;
    }
    while( v9 );
  }
  v10 = (unsigned int)v8;
  if( LeafVa + (MiLargePageSizes[(unsigned int)v8] << 12) - 1 > *(_QWORD *)(v6 + 40) )
    return 0i64;
  v11 = *(_QWORD *)(v3 + 8i64 * (unsigned int)v8);
  if( !v11 )
  {
    if( !(_DWORD)v8 )
      return 0i64;
    MiDemotePfnListChain(v3, v8);
    v11 = *(_QWORD *)(v3 + 8 * v10);
    if( !v11 )
      return 0i64;
  }
  *(_QWORD *)(v3 + 8 * v10) = *(_QWORD *)v11;
  ContainingPageTable = MiGetContainingPageTable((UINT64)a2);
  v13 = (char *)MmGetPfnDb() + 48 * ContainingPageTable;
  MiLockPageAtDpc((INT64)v13);
  *((_QWORD *)v13 + 3) ^= (*((_QWORD *)v13 + 3) ^ (*((_QWORD *)v13 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v13 + 3, 0x7FFFFFFFFFFFFFFFui64);
  MiLockPageAtDpc(v11);
  *(_QWORD *)(v11 + 8) = a2;
  *(_QWORD *)(v11 + 16) = MiMakeDemandZeroPte(4);
  MiSetPfnPageState(v11, 6);
  *(_QWORD *)(v11 + 40) ^= (ContainingPageTable ^ *(_QWORD *)(v11 + 40)) & 0xFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
  ValidPte = MiMakeValidPte((UINT64)a2, (v11 - (__int64)MmGetPfnDb()) / 48, 2214592516i64);
  if( (MI_READ_PTE_LOCK_FREE((INT64)a2) & 1) != 0 )
    MiTransformValidPteInPlace(a2, (UINT64)a2, ValidPte, (unsigned int)v5);
  else
    *a2 = ValidPte;
  result = 1i64;
  *(_QWORD *)(v3 + 48) += MiLargePageSizes[v10];
  return result;
}

Referenced by:

MiCreateSystemPageTable