MiPruneStandbyPages
VOID __stdcall MiPruneStandbyPages(_MI_PARTITION *Partition, UINT64 NodeNumber, UINT64 Channel, UINT64 NumberOfPages){
UINT64 v4;
unsigned int v5;
unsigned int v6;
_MMPFN *PfnDb;
unsigned int v8;
unsigned int v9;
_MI_PARTITION *v10;
int v11;
__int64 v12;
_QWORD *v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
signed __int32 v17;
INT64 Page;
INT64 v19;
ULONG_PTR v20;
char *v21;
unsigned __int64 v22;
UINT64 v23;
UINT64 v24;
char *v25;
BOOL IsFreeZeroPfnCold;
unsigned int v27;
unsigned int v28;
__int64 v29;
__int64 v30;
unsigned int PfnChannel;
UINT64 v32;
unsigned __int64 v33;
int v34;
ULONG_PTR BugCheckParameter2;
__int128 v36;
int v38;
unsigned int PreferredChannel;
UINT64 v40;
v40 = NumberOfPages;
PreferredChannel = Channel;
v4 = 0i64;
v5 = NodeNumber;
v36 = 0i64;
v6 = 1;
PfnDb = MmGetPfnDb();
v8 = 2;
v9 = Channel;
v10 = Partition;
v34 = *(_DWORD *)(*((_QWORD *)Partition + 2) + 4544i64 * (unsigned int)NodeNumber + 4280) & 1;
v11 = (unsigned __int16)KeNumberNodes;
if( (unsigned __int16)KeNumberNodes > 1u )
{
do
{
v12 = *(unsigned int *)(qword_140C4DBD8 + 4i64 * (v6 + v5 * v11));
v13 = (_QWORD *)(*((_QWORD *)v10 + 2) + 4544 * v12);
if( v13[522] || !*(_DWORD *)InitializationPhase )
{
v14 = (unsigned int)MmNumberOfChannels;
if( MmNumberOfChannels )
{
v15 = v14 * MiNodeFreeZeroPages(v13, v9, 4096);
if( v15 > 0x10000 )
{
MiInitializePageColorBase(0i64, (unsigned int)(v12 + 1), (INT64)&v36);
v16 = v15 - 0x10000;
if( v16 )
{
while( 1 )
{
v17 = _InterlockedExchangeAdd((volatile signed __int32 *)v36, 1u);
Page = MiGetPage(v10, DWORD2(v36) & (unsigned int)v17 | HIDWORD(v36), 0x40ui64);
v19 = Page;
if( Page == -1 )
{
NumberOfPages = v40;
}
else
{
LODWORD(v20) = MiSwapNumaStandbyPage(Page, v5, PreferredChannel, 16);
BugCheckParameter2 = v20;
v21 = (char *)MmGetPfnDb() + 48 * v20;
v22 = (unsigned __int8)MiLockPageInline((INT64)v21);
*((_QWORD *)v21 + 3) |= 0x4000000000000000ui64;
MiInsertPageInFreeOrZeroedList(BugCheckParameter2, 2ui64);
_InterlockedAnd64((volatile signed __int64 *)v21 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v22);
if( BugCheckParameter2 == v19 )
return;
NumberOfPages = v40;
if( ++v4 == v40 )
return;
}
v10 = Partition;
if( !--v16 )
goto LABEL_15;
}
}
}
NumberOfPages = v40;
LABEL_15:
v9 = PreferredChannel;
}
}
v11 = (unsigned __int16)KeNumberNodes;
++v6;
}
while( v6 < (unsigned __int16)KeNumberNodes );
PfnDb = MmGetPfnDb();
}
if( v4 < NumberOfPages )
{
do
{
v23 = MiRemoveLowestPriorityStandbyPage(v10, 8ui64, 0i64);
v24 = v23;
if( v23 == -1i64 )
break;
v38 = 0;
v25 = (char *)PfnDb + 48 * v23;
++v4;
IsFreeZeroPfnCold = MiIsFreeZeroPfnCold((INT64)v25);
v27 = v8;
v8 |= 0x400u;
v28 = v27 & 0xFFFFFBFF;
if( !IsFreeZeroPfnCold )
v8 = v28;
LODWORD(v29) = MiSearchNumaNodeTable((PVOID)((v25 - (char *)PfnDb) / 48));
v30 = *(unsigned int *)(v29 + 8);
PfnChannel = MiGetPfnChannel((INT64)v25);
if( (_DWORD)v30 != v5 || PfnChannel != PreferredChannel && v34 )
{
if( (unsigned __int64)MiNodeFreeZeroPages((_QWORD *)(*((_QWORD *)v10 + 2) + 4544 * v30), PfnChannel, 4096) >= 0x200 )
{
LODWORD(v32) = MiSwapNumaStandbyPage(v24, v5, PreferredChannel, 48);
if( v32 == v24 )
{
v38 = 1;
}
else
{
v24 = v32;
v25 = (char *)MmGetPfnDb() + 48 * v32;
v8 &= ~0x400u;
}
}
else
{
--v4;
}
}
v33 = (unsigned __int8)MiLockPageInline((INT64)v25);
*((_QWORD *)v25 + 3) |= 0x4000000000000000ui64;
MiInsertPageInFreeOrZeroedList(v24, v8);
_InterlockedAnd64((volatile signed __int64 *)v25 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v33);
if( v38 == 1 )
break;
PfnDb = MmGetPfnDb();
}
while( v4 < v40 );
}
}Referenced by:
MiRebalanceZeroFreeLists