MiPfnRangeIsZero
VOID __stdcall MiPfnRangeIsZero(VOID *DeleteVa, VOID *DeleteEndVa){
unsigned __int64 v2;
UINT64 v3;
UINT64 v4;
UINT64 v5;
UINT64 v6;
NTSTATUS v7;
int v8;
_MMPTE *PteBase;
__int64 v10;
signed __int64 v11;
__int64 v12;
UINT64 v13;
UINT64 v14;
__int64 v15;
_MMPFN *PfnDb;
_MMPFN *v17;
__int64 v18;
UINT64 v19;
UINT64 v20;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
bool v23;
signed __int32 v24;
__int64 v25;
unsigned __int64 v26;
__int64 v27;
__int64 v28;
INT64 *v29;
_MMPFN *a2[2];
__int128 v31;
int v32;
UINT64 v33;
__int64 v34;
v2 = (unsigned __int64)DeleteEndVa;
v3 = (UINT64)DeleteVa;
*(_OWORD *)a2 = 0i64;
if( DeleteEndVa > (char *)MmPfnDatabase + 4096 * MxPfnAllocation )
v2 = (unsigned __int64)MmPfnDatabase + 4096 * MxPfnAllocation;
v31 = 0i64;
if( (unsigned __int64)DeleteVa >= v2 )
return;
v4 = 0i64;
v5 = 0i64;
v6 = 0i64;
v29 = 0i64;
do
{
v7 = MI_IS_PHYSICAL_ADDRESS((VOID *)v3);
v8 = v7;
PteBase = MmGetPteBase();
v10 = 1i64;
v11 = (signed __int64)PteBase + ((v3 >> 9) & 0x7FFFFFFFF8i64);
v34 = 1i64;
LODWORD(v12) = 3;
if( v7 > 0 )
{
v27 = (unsigned int)v7;
do
{
LODWORD(v12) = v12 - 1;
v11 = (signed __int64)PteBase + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
--v27;
}
while( v27 );
if( (_DWORD)v12 != 3 )
{
v12 = (unsigned int)(v12 - 1);
v10 = MiLargePageSizes[v12];
v34 = v10;
}
}
if( (((v10 << 12) - 1) & v3) == 0 && v2 - v3 >= v10 << 12 )
{
if( (*(_BYTE *)v11 & 0x20) != 0 )
{
v25 = 512 - (((unsigned __int64)v11 >> 3) & 0x1FF);
v26 = (unsigned __int64)PteBase + ((v2 >> 9) & 0x7FFFFFFFF8i64);
if( v7 > 0 )
{
v28 = (unsigned int)v7;
do
{
v26 = (unsigned __int64)PteBase + ((v26 >> 9) & 0x7FFFFFFFF8i64);
--v28;
}
while( v28 );
}
if( ((v26 ^ v11) & 0xFFFFFFFFF000i64) == 0 )
v25 = (__int64)(v26 - v11) >> 3;
MiClearSystemAccessBits(v11, v25, (unsigned int)v7);
}
v32 = v8;
if( v8 < 4 )
{
MiPteInShadowRange((UINT64)&v33);
while( 1 )
{
LODWORD(v13) = MI_READ_PTE_LOCK_FREE(v11);
v33 = v13;
v14 = v13;
if( v8 != v32 && (v13 & 0x20) != 0 )
MiClearSystemAccessBits(v11, 1i64, 0i64);
MiPreparePfnDatabasePageForFree(v11, (unsigned int)v8, (unsigned int)v12);
v4 += v34;
v15 = (v14 >> 12) & 0xFFFFFFFFFi64;
PfnDb = MmGetPfnDb();
v17 = &PfnDb[v15];
v17->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)a2[(unsigned int)v12];
a2[(unsigned int)v12] = v17;
if( v8 == 3 )
{
v29 = (INT64 *)v11;
v6 = v11;
if( !v5 )
v5 = v11;
}
else
{
v6 = (UINT64)v29;
}
MiReplacePfnWithGapMapping((INT64 *)v11, (unsigned int)v8);
LODWORD(v18) = MiGetContainingPageTable(v11 & 0xFFFFFFFFFFFFF000ui64);
if( (PfnDb[v18].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1 )
break;
v34 = 1i64;
LODWORD(v12) = 3;
v11 = (signed __int64)MmGetPteBase() + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
if( ++v8 >= 4 )
goto LABEL_16;
}
v11 += 8i64;
}
LABEL_16:
v19 = v11;
goto LABEL_17;
}
if( !MiDemoteValidLargePageOneLevel(v3) )
{
v19 = v11 + 8;
LABEL_17:
LODWORD(v20) = MiGetLeafVa(v19);
v3 = v20;
}
}
while( v3 < v2 );
if( v5 )
MiReplicatePfnDatabaseMappings(v5, v6);
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 573, -(__int64)v4);
MiFreeLargeZeroPages((UINT64)&Irp, a2, 0i64);
MiReturnCommit(&Irp, v4);
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v4 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v4 >= 0x80000 )
break;
v24 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + v4,
CachedResidentAvailable);
v23 = (_DWORD)CachedResidentAvailable == v24;
LODWORD(CachedResidentAvailable) = v24;
if( v23 )
return;
}
while( v24 != -1 && v4 + v24 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v4 += (int)CachedResidentAvailable - 192;
}
}
if( v4 )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C50B28 + 883, v4);
}Referenced by:
MiFreedUnusedPfnPagesWorker