MiQueryVaPhysicalContiguity
INT64 __fastcall MiQueryVaPhysicalContiguity(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4){
INT64 v4;
__int64 v5;
_MMPTE *PteBase;
unsigned __int64 v7;
unsigned __int64 v8;
UINT64 v9;
int v10;
int v11;
unsigned int v12;
int v13;
UINT8 v14;
INT64 v15;
__int64 v16;
unsigned __int64 v17;
_MMPTE *v18;
unsigned int v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
UINT64 v23;
__int64 v24;
unsigned __int64 v25;
__int64 v26;
__int16 v27;
__int64 v28;
__int64 v29;
int v30;
INT64 v31;
unsigned __int64 v32;
_MMPFN *v33;
bool v34;
__int64 v35;
int v37;
int v38;
UINT64 v39;
unsigned __int64 v40;
unsigned __int64 v41;
__int64 v42;
__int64 v43;
unsigned int a6;
UINT8 v46;
int v47;
v47 = a4;
a6 = 0;
v4 = a1;
v5 = (unsigned int)a3;
PteBase = MmGetPteBase();
v43 = MiLargePageSizes[v5];
v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v42 = -1i64;
v8 = (unsigned __int64)PteBase + ((((v43 << 12) + a2 - 1) >> 9) & 0x7FFFFFFFF8i64);
v9 = 0i64;
v41 = v8;
v40 = 0i64;
v10 = 0;
v37 = 0;
v11 = 0;
v12 = 1;
v13 = 0;
v38 = a4 & 1;
v46 = MiLockWorkingSetShared(a1);
v14 = v46;
if( v7 > v8 )
goto LABEL_50;
v15 = v8;
while( 1 )
{
v16 = 1i64;
if( v9 )
{
if( (v7 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal(v4, v9);
v14 = v46;
v9 = 0i64;
}
if( v9 )
goto LABEL_21;
v15 = v41;
}
MiGetNextPageTable(v7, v15, 0i64, v14, 1, &a6);
if( !v17 )
break;
v18 = MmGetPteBase();
v19 = a6;
v9 = (UINT64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
if( a6 )
{
v40 = (unsigned __int64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
v20 = v40;
if( a6 > 1 )
{
v21 = a6 - 1;
do
{
v9 = (UINT64)v18 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
v20 = (unsigned __int64)v18 + ((v20 >> 9) & 0x7FFFFFFFF8i64);
--v21;
}
while( v21 );
v40 = v20;
}
v9 = (UINT64)v18 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
}
else
{
v20 = v40;
}
if( v17 != v7 )
break;
if( a6 )
{
v22 = (__int64)((v7 << 25) - ((_QWORD)v18 << 25)) >> 16;
v39 = MI_READ_PTE_LOCK_FREE(v20);
v23 = v39;
MiPteInShadowRange((UINT64)&v39);
v24 = (v23 >> 12) & 0xFFFFFFFFFi64;
v25 = v22 >> 12;
v26 = v19;
do
{
v27 = v25;
v25 >>= 9;
v28 = v16 * (v27 & 0x1FF);
v16 <<= 9;
v24 += v28;
--v26;
}
while( v26 );
v13 = 1;
v29 = v16 - (v24 & (v16 - 1));
goto LABEL_32;
}
LABEL_21:
v30 = 0;
v31 = MI_READ_PTE_LOCK_FREE(v7);
v39 = v31;
v32 = v31;
if( (v31 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v39);
v24 = (v32 >> 12) & 0xFFFFFFFFFi64;
v33 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v24);
}
else
{
if( (v31 & 0x400) != 0
|| (v31 & 0x800) == 0
|| (v47 & 2) != 0
|| (v33 = MiLockTransitionLeafPage((_MMPTE *)v7, 0i64)) == 0i64 )
{
v11 = 1;
LABEL_46:
v4 = a1;
goto LABEL_47;
}
v30 = 1;
v24 = (v33 - MmGetPfnDb()) / 48;
}
if( !(unsigned int)MiCheckContiguityTradeEligible((INT64)v33) )
v13 = 1;
v34 = v30 == 0;
v29 = 1i64;
if( !v34 )
_InterlockedAnd64((volatile signed __int64 *)v33 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_32:
if( v42 == -1 )
v34 = ((v43 - 1) & v24) == 0;
else
v34 = v42 == v24;
if( !v34 )
{
v37 = 1;
if( !v38 )
goto LABEL_46;
}
v35 = v24 + v29;
v4 = a1;
v42 = v35;
if( (v7 & 0x78) == 0 && MiWorkingSetIsContended(a1) || KeShouldYieldProcessor() )
{
if( v9 )
{
MiUnlockPageTableInternal(a1, v9);
v9 = 0i64;
}
MiUnlockWorkingSetShared(a1, v46);
MiLockWorkingSetShared(a1);
}
v15 = v41;
v7 += 8 * v29;
v14 = v46;
if( v7 > v41 )
goto LABEL_47;
}
v11 = 1;
LABEL_47:
if( v9 )
MiUnlockPageTableInternal(v4, v9);
v14 = v46;
v10 = v37;
LABEL_50:
MiUnlockWorkingSetShared(v4, v14);
if( v11 )
{
return(unsigned int)(v13 != 0) + 2;
}
else if( v10 )
{
return v13 != 0 ? 3 : 0;
}
return v12;
}Referenced by:
MiProcessVaContiguityInformation
MiQueryMemoryPhysicalContiguity