MiCommitPageTablesForVad
int __fastcall MiCommitPageTablesForVad(__int64 a1, unsigned __int64 a2, unsigned __int64 a3){
ULONG_PTR v4;
unsigned int v5;
unsigned __int64 v6;
unsigned __int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
int result;
__int64 v12;
BOOL v13;
int v14;
__int64 v15;
INT64 v16;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
__int64 v21;
__int64 v22;
INT64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
int v27;
unsigned __int64 v28;
__int64 v29;
__int64 v30;
unsigned __int64 v31;
bool v32;
int v33;
BOOL v34;
__int64 v35;
__int64 v36;
ULONG_PTR v37;
unsigned __int64 v38;
unsigned __int64 v39;
__int64 v40;
INT64 v41;
UINT64 PagesCharged;
v4 = *((_QWORD *)KeGetCurrentThread() + 23);
v37 = v4;
if( *(_QWORD *)(a1 + 16) != -2i64 || !(unsigned int)MiVadPureReserve(a1) )
{
v5 = 0;
v38 = (unsigned int)(a2 >> 21);
v39 = (unsigned int)(a3 >> 21);
PagesCharged = 0i64;
v6 = v38;
v7 = v39;
v8 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64);
do
{
v9 = 2 - v5;
v10 = *(_QWORD *)(v8 + 16 * (v9 + 31) + 48);
result = MiMakeHyperRangeAccessible((PVOID)(v10 + (v6 >> 3)), (PVOID)(v10 + (v7 >> 3)), &PagesCharged);
if( result < 0 )
return result;
++v5;
*(_QWORD *)(v8 + 8 * v9 + 584) += PagesCharged;
v6 >>= 9;
v7 >>= 9;
}
while( v5 < 2 );
v12 = *(_QWORD *)(v4 + 1680);
v40 = v12;
MiVadPageTableChargeLevel(a1);
v13 = MiVadLeafPagesPrecharged(a1);
v14 = 0;
v34 = v13;
v36 = v15;
v16 = v12 + 568;
LODWORD(PagesCharged) = 0;
v41 = v12 + 568;
v17 = v15;
while( 1 )
{
v33 = v14;
v18 = v38;
v19 = 0i64;
v20 = v39;
v21 = 0i64;
v22 = 0i64;
v23 = v16;
do
{
v24 = 0i64;
v25 = 0i64;
v35 = 0i64;
v26 = v18;
if( v18 <= v20 )
{
while( 1 )
{
if( !_bittest64(*(const signed __int64 **)(v23 + 8), v26) )
{
++v25;
if( v14 != 1 )
{
LODWORD(PagesCharged) = 1;
if( !(unsigned int)MiCreateSystemWsles() && (v26 == v18 || (v26 & 7) == 0) )
{
v32 = RtlAreBitsClearEx(v23, v26 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
v24 = v35;
v14 = v33;
v27 = PagesCharged;
if( v32 )
v24 = ++v35;
}
goto LABEL_10;
}
_bittestandset64(*(signed __int64 **)(v23 + 8), v26);
}
v27 = PagesCharged;
LABEL_10:
if( ++v26 > v20 )
{
v17 = v36;
goto LABEL_12;
}
}
}
v27 = PagesCharged;
LABEL_12:
if( v22 >= v17 )
v19 += v25;
v21 += v24;
v18 >>= 9;
v20 >>= 9;
++v22;
v23 -= 16i64;
}
while( v22 < 3 );
if( v14 )
return 0;
v28 = v21 + v19;
if( !v34 && !(unsigned int)MiVadPureReserve(a1) )
{
v30 = *(unsigned int *)(a1 + 52);
LODWORD(v30) = v30 & 0x7FFFFFFF;
v31 = v30 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31);
if( v31 != 0x7FFFFFFFEi64 )
v28 += v31;
}
if( v28 )
{
result = MiChargeFullProcessCommitment(v37, v28);
if( result < 0 )
return result;
v17 = v36;
v27 = PagesCharged;
}
if( v27 != 1 )
return 0;
*(_QWORD *)(v40 + 288) += v19;
if( v21 )
MiUpdateChargedWsles(v37 + 1664);
v16 = v41;
v14 = 1;
}
}
v29 = *(unsigned int *)(a1 + 52);
LODWORD(v29) = v29 & 0x7FFFFFFF;
if( !(v29 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31)) )
return 0;
result = MiChargeFullProcessCommitment(v4, v29 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31));
if( result >= 0 )
return 0;
return result;
}Referenced by:
MiCommitExistingVad
MiCommitPageTableRangesForVad
MiInsertVadCharges
MiSetProtectionOnSection
MiSplitPrivatePage