MiComputePageCommitment
__int64 __fastcall MiComputePageCommitment(
unsigned __int64 a1,
unsigned __int64 a2,
__int64 a3,
char a4,
char a5,
_QWORD *a6){
int v6;
unsigned __int64 v7;
__int64 v8;
_MMPTE *PteBase;
unsigned __int64 v10;
unsigned __int64 v11;
__int64 v12;
_QWORD *v13;
char v14;
INT64 *v15;
__int64 v16;
unsigned __int64 v17;
__int64 v18;
__int64 v19;
int IsPteDecommittedPage;
UINT64 v21;
int v22;
unsigned int v23;
__int64 v24;
unsigned __int64 v25;
_QWORD *CloneAddress;
unsigned __int64 v27;
UNICODE_STRING *v28;
UINT8 v29;
PWCHAR v30;
int v31;
__int64 v32;
unsigned __int64 v34;
UINT64 v35;
__int64 v36;
bool v37;
INT64 v38;
__int64 v39;
UINT64 v40;
INT64 v41;
unsigned int v42;
unsigned __int64 v43;
__int64 v44;
char v45;
v45 = a4;
v42 = 0;
v6 = 0;
v7 = (a1 >> 9) & 0x7FFFFFFFF8i64;
v39 = *((_QWORD *)KeGetCurrentThread() + 23);
v8 = *(_QWORD *)(v39 + 1680);
v41 = v39 + 1664;
PteBase = MmGetPteBase();
v44 = v8;
v10 = (unsigned __int64)PteBase + v7;
v11 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v43 = v11;
if( *(int *)(a3 + 52) >= 0 )
{
v12 = 0i64;
}
else
{
v6 = 2;
v12 = ((__int64)(v11 - v10) >> 3) + 1;
}
v13 = a6;
if( a6 )
*a6 = 0i64;
if( v10 <= v11 )
{
v14 = a5;
do
{
MiGetNextPageTable(v10, v11, 0i64, a4, v14, &v42);
v10 = (unsigned __int64)v15;
if( !v15 )
return v12;
v17 = (unsigned __int64)v15;
v18 = 1i64;
if( v42 )
{
v19 = v42;
v16 = (__int64)MmGetPteBase();
do
{
v17 = v16 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
v18 <<= 9;
--v19;
}
while( v19 );
}
v40 = (UINT64)MmGetPteBase() + ((v17 >> 9) & 0x7FFFFFFFF8i64);
do
{
v38 = *(_QWORD *)v17;
if( !v38 )
goto LABEL_32;
IsPteDecommittedPage = MiIsPteDecommittedPage((_MMPTE *)&v38, (_MMPFN_IDENTITY *)v16);
v22 = v6;
v6 |= 1u;
v23 = v22 & 0xFFFFFFFE;
if( !IsPteDecommittedPage )
v6 = v23;
if( (v6 & 2) != 0 )
{
v24 = v12 - v18;
if( (v6 & 1) == 0 )
v24 = v12;
v12 = v24;
}
else if( (v6 & 1) == 0 )
{
v12 += v18;
}
if( !v13 )
goto LABEL_31;
v25 = *(_QWORD *)(v8 + 360);
if( !v25 || (v6 & 1) != 0 )
goto LABEL_30;
CloneAddress = 0i64;
if( (v21 & 1) != 0 )
{
v27 = MI_READ_PTE_LOCK_FREE((INT64)&v38);
LOBYTE(v31) = MI_PFN_IS_PROTO(
(UNICODE_STRING *)MmGetPfnDb() + 3 * ((v27 >> 12) & 0xFFFFFFFFFi64),
v28,
v29,
v30);
if( !v31 )
goto LABEL_47;
v16 = 0x1000000000i64;
if( (*(_QWORD *)(v32 + 40) & 0x1000000000i64) == 0 && *(__int64 *)(v32 + 8) > 0 )
{
v13 = a6;
LABEL_30:
v8 = v44;
LABEL_31:
v11 = v43;
goto LABEL_32;
}
v34 = *(_QWORD *)(v32 + 8) | 0x8000000000000000ui64;
goto LABEL_46;
}
if( (v21 & 0x400) != 0 && !MiIsPrototypePteVadLookup(v21) && !MI_PROTO_FORMAT_COMBINED(v35) )
{
if( qword_140C4DC80 && (v36 & 0x10) == 0 )
v36 &= ~qword_140C4DC80;
v34 = v36 >> 16;
LABEL_46:
CloneAddress = MiLocateCloneAddress(v39, v34);
}
LABEL_47:
v11 = v43;
if( CloneAddress )
{
v37 = v25 <= CloneAddress[12];
v13 = a6;
v8 = v44;
if( !v37 )
++*a6;
}
else
{
v13 = a6;
v8 = v44;
}
LABEL_32:
v17 += 8i64;
v10 += 8 * v18;
}
while( (v17 & 0xFFF) != 0 && v10 <= v11 );
v14 = a5;
if( (a5 & 4) == 0 )
{
MiUnlockPageTableInternal(v41, v40);
v14 = a5;
}
a4 = v45;
}
while( v10 <= v11 );
}
return v12;
}Referenced by:
MiCommitExistingVad
MiCountCommittedPages
MiDeletePartialVad
MiProtectPrivateMemory
MiSetProtectionOnSection