MiEmptyPteBins
UINT64 __stdcall MiEmptyPteBins(_MI_SYSTEM_PTE_TYPE *PteInfo, UINT64 IncludeBinsNeedingFlush){
UINT64 v2;
unsigned int v4;
int v5;
volatile _MI_CACHED_PTES *CachedPtes;
unsigned int v7;
unsigned int v8;
unsigned int i;
volatile signed __int64 *v10;
signed __int64 v11;
int v13;
unsigned __int8 CurrentIrql;
unsigned __int64 v15;
int v16;
signed __int32 v17[22];
_MI_CACHED_PTE CachedPte;
int v19;
v19 = IncludeBinsNeedingFlush;
v2 = 0i64;
v4 = 0;
_InterlockedOr(v17, 0);
v5 = KiTbFlushTimeStamp;
CachedPtes = PteInfo->CachedPtes;
v7 = 0;
v8 = 2 * (unsigned __int16)KeNumberNodes;
if( PteInfo != (_MI_SYSTEM_PTE_TYPE *)&qword_140C4EC80 )
v8 = (unsigned __int16)KeNumberNodes;
if( v8 )
{
while( 2 )
{
for( i = 0; i < 8; ++i )
{
v10 = (volatile signed __int64 *)&CachedPtes->Bins[i];
v11 = *v10;
CachedPte = (_MI_CACHED_PTE)v11;
if( (_DWORD)v11 )
{
if( (unsigned int)(v5 - v11) <= 2 )
{
if( (v11 & 1) != 0 || (v13 = 0, (unsigned int)(v5 - v11) < 2) )
v13 = 1;
}
else
{
v13 = 0;
}
if( v13 != 1 || (_DWORD)IncludeBinsNeedingFlush )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( CurrentIrql == 2 && PteInfo == (_MI_SYSTEM_PTE_TYPE *)&qword_140C4EC80 && v7 >= v8 >> 1 )
{
__writecr8(2ui64);
return v4;
}
if( v11 == _InterlockedCompareExchange64(v10, 0i64, v11) )
{
_InterlockedOr(v17, 0);
if( (unsigned int)(KiTbFlushTimeStamp - CachedPte.GlobalTimeStamp) <= 2
&& ((CachedPte.GlobalTimeStamp & 1) != 0
|| (unsigned int)(KiTbFlushTimeStamp - CachedPte.GlobalTimeStamp) < 2) )
{
v2 = 1i64;
}
if( PteInfo == (_MI_SYSTEM_PTE_TYPE *)&qword_140C4EC80 && v7 >= v8 >> 1 )
{
v16 = MiReleaseLargePteMappings(PteInfo, &CachedPte, v2);
__writecr8(CurrentIrql);
}
else
{
v15 = MiReplenishBitMap((INT64)PteInfo, CachedPte.PteIndex, v2);
v16 = v15;
_InterlockedExchangeAdd64((volatile signed __int64 *)&PteInfo->TotalFreeSystemPtes, v15);
}
_InterlockedExchangeAdd(&CachedPtes->CachedPteCount, -v16);
LODWORD(IncludeBinsNeedingFlush) = v19;
v4 = 1;
v2 = 0i64;
}
else
{
--i;
}
__writecr8(CurrentIrql);
}
}
}
++CachedPtes;
if( ++v7 < v8 )
continue;
break;
}
}
return v4;
}Referenced by:
MiAdjustPteBins
MiCheckProcessorPteCache
MiInsertCachedPte
MiReservePtes