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