MiPfnRangeIsZero
VOID __stdcall MiPfnRangeIsZero(PVOID DeleteVa, PVOID DeleteEndVa){
unsigned __int64 v2;
UINT64 LeafVa;
UINT64 v4;
UINT64 v5;
UINT64 v6;
int v7;
int v8;
_MMPTE *PteBase;
__int64 v10;
signed __int64 v11;
__int64 v12;
INT64 v13;
unsigned __int64 v14;
__int64 v15;
_MMPFN *PfnDb;
_QWORD *v17;
UINT64 v18;
struct _KPRCB *CurrentPrcb;
__int64 v20;
bool v21;
signed __int32 v22;
__int64 v23;
unsigned __int64 v24;
__int64 v25;
__int64 v26;
volatile INT64 *v27;
CHAR a2[16];
__int128 v29;
int v30;
UINT64 v31;
__int64 v32;
v2 = (unsigned __int64)DeleteEndVa;
LeafVa = (UINT64)DeleteVa;
*(_OWORD *)a2 = 0i64;
if( (unsigned __int64)DeleteEndVa > MmPfnDatabase + (MxPfnAllocation << 12) )
v2 = MmPfnDatabase + (MxPfnAllocation << 12);
v29 = 0i64;
if( (unsigned __int64)DeleteVa >= v2 )
return;
v4 = 0i64;
v5 = 0i64;
v6 = 0i64;
v27 = 0i64;
do
{
v7 = MI_IS_PHYSICAL_ADDRESS((PVOID)LeafVa);
v8 = v7;
PteBase = MmGetPteBase();
v10 = 1i64;
v11 = (signed __int64)PteBase + ((LeafVa >> 9) & 0x7FFFFFFFF8i64);
v32 = 1i64;
LODWORD(v12) = 3;
if( v7 > 0 )
{
v25 = (unsigned int)v7;
do
{
LODWORD(v12) = v12 - 1;
v11 = (signed __int64)PteBase + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
--v25;
}
while( v25 );
if( (_DWORD)v12 != 3 )
{
v12 = (unsigned int)(v12 - 1);
v10 = MiLargePageSizes[v12];
v32 = v10;
}
}
if( (((v10 << 12) - 1) & LeafVa) == 0 && v2 - LeafVa >= v10 << 12 )
{
if( (*(_BYTE *)v11 & 0x20) != 0 )
{
v23 = 512 - (((unsigned __int64)v11 >> 3) & 0x1FF);
v24 = (unsigned __int64)PteBase + ((v2 >> 9) & 0x7FFFFFFFF8i64);
if( v7 > 0 )
{
v26 = (unsigned int)v7;
do
{
v24 = (unsigned __int64)PteBase + ((v24 >> 9) & 0x7FFFFFFFF8i64);
--v26;
}
while( v26 );
}
if( ((v24 ^ v11) & 0xFFFFFFFFF000i64) == 0 )
v23 = (__int64)(v24 - v11) >> 3;
MiClearSystemAccessBits(v11, v23, (unsigned int)v7);
}
v30 = v8;
if( v8 < 4 )
{
MiPteInShadowRange((UINT64)&v31);
while( 1 )
{
v13 = MI_READ_PTE_LOCK_FREE(v11);
v31 = v13;
v14 = v13;
if( v8 != v30 && (v13 & 0x20) != 0 )
MiClearSystemAccessBits(v11, 1i64, 0i64);
MiPreparePfnDatabasePageForFree(v11, (unsigned int)v8, (unsigned int)v12);
v4 += v32;
v15 = 3 * ((v14 >> 12) & 0xFFFFFFFFFi64);
PfnDb = MmGetPfnDb();
v17 = (_QWORD *)((char *)PfnDb + 16 * v15);
*v17 = *(_QWORD *)&a2[8 * (unsigned int)v12];
*(_QWORD *)&a2[8 * (unsigned int)v12] = v17;
if( v8 == 3 )
{
v27 = (volatile INT64 *)v11;
v6 = v11;
if( !v5 )
v5 = v11;
}
else
{
v6 = (UINT64)v27;
}
MiReplacePfnWithGapMapping((volatile INT64 *)v11, (unsigned int)v8);
if( (*((_QWORD *)PfnDb + 6 * MiGetContainingPageTable(v11 & 0xFFFFFFFFFFFFF000ui64) + 3) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
break;
v32 = 1i64;
LODWORD(v12) = 3;
v11 = (signed __int64)MmGetPteBase() + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
if( ++v8 >= 4 )
goto LABEL_16;
}
v11 += 8i64;
}
LABEL_16:
v18 = v11;
goto LABEL_17;
}
if( !(unsigned int)MiDemoteValidLargePageOneLevel(LeafVa) )
{
v18 = v11 + 8;
LABEL_17:
LeafVa = MiGetLeafVa(v18);
}
}
while( LeafVa < v2 );
if( v5 )
MiReplicatePfnDatabaseMappings(v5, v6);
_InterlockedExchangeAdd64(&qword_140C4ED18, -(__int64)v4);
MiFreeLargeZeroPages((UINT64)&MiSystemPartition, a2, 0i64);
MiReturnCommit((_MI_PARTITION *)&MiSystemPartition, v4);
CurrentPrcb = KeGetCurrentPrcb();
v20 = *((int *)CurrentPrcb + 8391);
if( (_DWORD)v20 != -1 )
{
if( v4 + v20 <= 0x100 )
{
do
{
if( v4 >= 0x80000 )
break;
v22 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v20 + v4, v20);
v21 = (_DWORD)v20 == v22;
LODWORD(v20) = v22;
if( v21 )
return;
}
while( v22 != -1 && v4 + v22 <= 0x100 );
}
if( (int)v20 > 192
&& (_DWORD)v20 != -1
&& (_DWORD)v20 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v20) )
{
v4 += (int)v20 - 192;
}
}
if( v4 )
_InterlockedExchangeAdd64(&qword_140C526C0, v4);
}Referenced by:
MiFreedUnusedPfnPagesWorker