MiPreparePfnDatabasePageForFree
INT64 __fastcall MiPreparePfnDatabasePageForFree(INT64 a1, INT64 a2, INT64 a3){
int v3;
int v4;
_MMPFN *PfnDb;
char *v6;
char *v7;
INT64 result;
__int64 v9[7];
UINT64 SpinCount;
UINT64 v11;
v3 = a3;
v4 = a2;
v9[0] = MI_READ_PTE_LOCK_FREE(a1);
PfnDb = MmGetPfnDb();
v6 = (char *)PfnDb + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v9) >> 12) & 0xFFFFFFFFFi64);
if( !v4 && v3 == 3 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v6 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v6 + 3) < 0 );
}
--*((_WORD *)v6 + 16);
_InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
v7 = (char *)PfnDb + 48 * (*((_QWORD *)v6 + 5) & 0xFFFFFFFFFi64);
LODWORD(v11) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v11);
while( *((__int64 *)v7 + 3) < 0 );
}
result = *((_QWORD *)v7 + 3);
*((_QWORD *)v7 + 3) = result ^ (result ^ (result - 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( !v4 )
{
result = ZeroPte;
*((_QWORD *)v6 + 2) = ZeroPte;
}
return result;
}Referenced by:
MiPfnRangeIsZero