MiCommitPageTablesForVad
NTSTATUS __stdcall MiCommitPageTablesForVad(_MMVAD_SHORT *Vad, VOID *StartingVa, VOID *EndingVa){
_EPROCESS *Process;
unsigned int v5;
unsigned __int64 v6;
unsigned __int64 v7;
_MMWSL_INSTANCE *VmWorkingSetList;
__int64 v9;
_MMPTE *v10;
NTSTATUS result;
_MMWSL_INSTANCE *v12;
int v13;
int v14;
__int64 v15;
_RTL_BITMAP_EX *p_NextPteToAge;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
__int64 v21;
__int64 v22;
_RTL_BITMAP_EX *v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
int v27;
UINT64 v28;
__int64 v29;
__int64 LongFlags1;
unsigned __int64 v31;
char v32;
int v33;
int v34;
__int64 v35;
__int64 v36;
_EPROCESS *TargetProcess;
unsigned __int64 v38;
unsigned __int64 v39;
_MMWSL_INSTANCE *v40;
_RTL_BITMAP_EX *v41;
UINT64 PagesCharged;
Process = KeGetCurrentThread()->ApcState.Process;
TargetProcess = Process;
if( Vad->VadNode.ParentValue != -2i64 || !MiVadPureReserve(Vad) )
{
v5 = 0;
v38 = (unsigned int)((unsigned __int64)StartingVa >> 21);
v39 = (unsigned int)((unsigned __int64)EndingVa >> 21);
PagesCharged = 0i64;
v6 = v38;
v7 = v39;
VmWorkingSetList = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList;
do
{
v9 = 2 - v5;
v10 = (&VmWorkingSetList[12].NextPteToAccessClear)[2 * v9 + 6];
result = MiMakeHyperRangeAccessible((char *)v10 + (v6 >> 3), (char *)v10 + (v7 >> 3), &PagesCharged);
if( result < 0 )
return result;
++v5;
*((_QWORD *)&VmWorkingSetList[14].LastAccessClearingRemainder + v9) += PagesCharged;
v6 >>= 9;
v7 >>= 9;
}
while( v5 < 2 );
v12 = Process->Vm.Instance.VmWorkingSetList;
v40 = v12;
MiVadPageTableChargeLevel((INT64)Vad);
LOBYTE(v13) = MiVadLeafPagesPrecharged((INT64)Vad);
v14 = 0;
v34 = v13;
v36 = v15;
p_NextPteToAge = (_RTL_BITMAP_EX *)&v12[14].NextPteToAge;
LODWORD(PagesCharged) = 0;
v41 = (_RTL_BITMAP_EX *)&v12[14].NextPteToAge;
v17 = v15;
while( 1 )
{
v33 = v14;
v18 = v38;
v19 = 0i64;
v20 = v39;
v21 = 0i64;
v22 = 0i64;
v23 = p_NextPteToAge;
do
{
v24 = 0i64;
v25 = 0i64;
v35 = 0i64;
v26 = v18;
if( v18 <= v20 )
{
while( 1 )
{
if( !_bittest64((const signed __int64 *)v23->Buffer, v26) )
{
++v25;
if( v14 != 1 )
{
LODWORD(PagesCharged) = 1;
if( !MiCreateSystemWsles() && (v26 == v18 || (v26 & 7) == 0) )
{
RtlAreBitsClearEx(v23, v26 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
v24 = v35;
v14 = v33;
v27 = PagesCharged;
if( v32 == 1 )
v24 = ++v35;
}
goto LABEL_10;
}
_bittestandset64((signed __int64 *)v23->Buffer, 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;
}
while( v22 < 3 );
if( v14 )
return 0;
v28 = v21 + v19;
if( !v34 && !MiVadPureReserve(Vad) )
{
LongFlags1 = Vad->u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v31 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
if( v31 != 0x7FFFFFFFEi64 )
v28 += v31;
}
if( v28 )
{
result = MiChargeFullProcessCommitment((ULONG_PTR)TargetProcess, v28);
if( result < 0 )
return result;
v17 = v36;
v27 = PagesCharged;
}
if( v27 != 1 )
return 0;
v40[7].NextPteToAge = (_MMPTE *)((char *)v40[7].NextPteToAge + v19);
if( v21 )
MiUpdateChargedWsles((INT64)&TargetProcess->Vm);
p_NextPteToAge = v41;
v14 = 1;
}
}
v29 = Vad->u1.LongFlags1;
LODWORD(v29) = v29 & 0x7FFFFFFF;
if( !(v29 | ((unsigned __int64)Vad->CommitChargeHigh << 31)) )
return 0;
result = MiChargeFullProcessCommitment((ULONG_PTR)Process, v29 | ((unsigned __int64)Vad->CommitChargeHigh << 31));
if( result >= 0 )
return 0;
return result;
}Referenced by:
MiCommitExistingVad
MiCommitPageTableRangesForVad
MiInsertVadCharges
MiSetProtectionOnSection
MiSplitPrivatePage