MiPreparePfnDatabasePageForFree
NTSTATUS __stdcall MiPreparePfnDatabasePageForFree(INT64 a1, INT64 a2, INT64 a3){
int v3;
int v4;
__int64 v5;
unsigned __int64 v6;
_MMPFN *PfnDb;
_MMPFN *v8;
_MMPFN *v9;
__int64 bf_0;
__int64 v12[7];
UINT64 SpinCount;
UINT64 v14;
v3 = a3;
v4 = a2;
LODWORD(v5) = MI_READ_PTE_LOCK_FREE(a1);
v12[0] = v5;
LODWORD(v6) = MI_READ_PTE_LOCK_FREE((INT64)v12);
PfnDb = MmGetPfnDb();
v8 = &PfnDb[(v6 >> 12) & 0xFFFFFFFFFi64];
if( !v4 && v3 == 3 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v8->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v8->u2._bf_0 < 0 );
}
--v8->u3.ReferenceCount;
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
v9 = &PfnDb[v8->u4._bf_0 & 0xFFFFFFFFFi64];
LODWORD(v14) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v9->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v14);
while( v9->u2._bf_0 < 0 );
}
bf_0 = v9->u2._bf_0;
v9->u2._bf_0 = bf_0 ^ (bf_0 ^ (bf_0 - 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( !v4 )
{
LODWORD(bf_0) = ZeroPte.u.Long;
v8->OriginalPte = ZeroPte;
}
return bf_0;
}Referenced by:
MiPfnRangeIsZero