MiMakeLargePageTable

NTSTATUS __stdcall MiMakeLargePageTable(INT64 a1, INT64 *a2, INT64 a3){
  INT64 v3; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  INT64 v12; 
  __int64 v13; 
  __int64 v14; 
  _MMPFN *v15; 
  INT64 v16; 
  INT64 v17; 
  int v18; 
  NTSTATUS result; 

  v3 = *(_QWORD *)(a1 + 168);
  v5 = (int)a3;
  if( (*(_DWORD *)(v3 + 64) & 0x80u) == 0 )
    return 0;
  if( (unsigned int)(a3 - 1) > 1 )
    return 0;
  LODWORD(v6) = MiGetLeafVa((UINT64)a2);
  v8 = v6;
  if( v6 < *(_QWORD *)(v7 + 32) )
    return 0;
  v9 = 1i64;
  if( v5 > 1 )
  {
    v10 = v5 - 1;
    do
    {
      v9 = (unsigned int)(v9 - 1);
      --v10;
    }
    while( v10 );
  }
  v11 = (unsigned int)v9;
  if( v8 + (MiLargePageSizes[(unsigned int)v9] << 12) - 1 > *(_QWORD *)(v7 + 40) )
    return 0;
  v12 = *(_QWORD *)(v3 + 8i64 * (unsigned int)v9);
  if( !v12 )
  {
    if( !(_DWORD)v9 )
      return 0;
    MiDemotePfnListChain(v3, v9);
    v12 = *(_QWORD *)(v3 + 8 * v11);
    if( !v12 )
      return 0;
  }
  *(_QWORD *)(v3 + 8 * v11) = *(_QWORD *)v12;
  LODWORD(v13) = MiGetContainingPageTable((UINT64)a2);
  v14 = v13;
  v15 = &MmGetPfnDb()[v13];
  MiLockPageAtDpc((INT64)v15);
  v15->u2._bf_0 ^= (v15->u2._bf_0 ^ (v15->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  MiLockPageAtDpc(v12);
  *(_QWORD *)(v12 + 8) = a2;
  *(_QWORD *)(v12 + 16) = MiMakeDemandZeroPte(4);
  MiSetPfnPageState(v12, 6);
  *(_QWORD *)(v12 + 40) ^= (v14 ^ *(_QWORD *)(v12 + 40)) & 0xFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
  LODWORD(v16) = MiMakeValidPte((_XSTATE_CONFIGURATION *)a2, (v12 - (__int64)MmGetPfnDb()) / 48, 2214592516i64);
  v17 = v16;
  if( (MI_READ_PTE_LOCK_FREE((INT64)a2) & 1) != 0 )
  {
    MiTransformValidPteInPlace(a2, (UINT64)a2, v17, (unsigned int)v5);
  }
  else
  {
    LOBYTE(v18) = MiPteInShadowRange((UINT64)a2);
    if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
      v17 |= 0x8000000000000000ui64;
    *a2 = v17;
  }
  result = 1;
  *(_QWORD *)(v3 + 48) += MiLargePageSizes[v11];
  return result;
}

Referenced by:

MiCreateSystemPageTable