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;
_MI_NODE_INFORMATION *v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
signed __int32 v18;
UINT64 v19;
UINT64 v20;
UINT64 v21;
_MMPFN *v22;
unsigned __int64 v23;
INT64 v24;
UINT64 v25;
UINT64 v26;
UINT64 v27;
_MMPFN *v28;
int v29;
unsigned int v30;
unsigned int v31;
__int64 v32;
__int64 v33;
unsigned int PfnChannel;
unsigned __int64 v35;
UINT64 v36;
unsigned __int64 v37;
INT64 v38;
UINT64 v39;
UINT64 v40;
UINT64 PageFrameIndex;
UINT64 PageFrameIndexa;
_MI_COLOR_BASE ColorBase[22];
int v45;
unsigned int PreferredChannel;
UINT64 v47;
v47 = NumberOfPages;
PreferredChannel = Channel;
v4 = 0i64;
v5 = NodeNumber;
*(_OWORD *)ColorBase = 0i64;
v6 = 1;
PfnDb = MmGetPfnDb();
v8 = 2;
v9 = Channel;
v10 = Partition;
LODWORD(v40) = *(_DWORD *)&Partition->Core.NodeInformation[(unsigned int)NodeNumber].Flags & 1;
v11 = (unsigned __int16)KeNumberNodes;
if( (unsigned __int16)KeNumberNodes > 1u )
{
do
{
v12 = *(unsigned int *)(*(&stru_140C4DB30 + 21) + 4i64 * (v6 + v5 * v11));
v13 = &v10->Core.NodeInformation[v12];
if( v13->TotalPagesEntireNode || !(_DWORD)InitializationPhase )
{
v14 = (unsigned int)MmNumberOfChannels;
if( MmNumberOfChannels )
{
LODWORD(v15) = MiNodeFreeZeroPages(v13, v9, 0x1000ui64);
v16 = v14 * v15;
if( (unsigned __int64)(v14 * v15) > 0x10000 )
{
MiInitializePageColorBase(0i64, (unsigned int)(v12 + 1), ColorBase);
v17 = v16 - 0x10000;
if( v17 )
{
while( 1 )
{
v18 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
LODWORD(v19) = MiGetPage(
(ULONG_PTR *)&v10->Core.PartitionId,
ColorBase[2] & (unsigned int)v18 | ColorBase[3],
0x40ui64);
v20 = v19;
if( v19 == -1i64 )
{
NumberOfPages = v47;
}
else
{
LODWORD(v21) = MiSwapNumaStandbyPage(v19, v5, PreferredChannel, 0x10ui64);
PageFrameIndexa = v21;
v22 = &MmGetPfnDb()[v21];
v23 = MiLockPageInline(v22);
v22->u2._bf_0 |= 0x4000000000000000ui64;
MiInsertPageInFreeOrZeroedList(PageFrameIndexa, 2ui64, v24, v25, v40, PageFrameIndexa);
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v23);
if( PageFrameIndex == v20 )
return;
NumberOfPages = v47;
if( ++v4 == v47 )
return;
}
v10 = Partition;
if( !--v17 )
goto LABEL_15;
}
}
}
NumberOfPages = v47;
LABEL_15:
v9 = PreferredChannel;
}
}
v11 = (unsigned __int16)KeNumberNodes;
++v6;
}
while( v6 < (unsigned __int16)KeNumberNodes );
PfnDb = MmGetPfnDb();
}
if( v4 < NumberOfPages )
{
do
{
LODWORD(v26) = MiRemoveLowestPriorityStandbyPage(v10, 8ui64, 0i64);
v27 = v26;
if( v26 == -1i64 )
break;
v45 = 0;
v28 = &PfnDb[v26];
++v4;
LOBYTE(v29) = MiIsFreeZeroPfnCold((INT64)v28);
v30 = v8;
v8 |= 0x400u;
v31 = v30 & 0xFFFFFBFF;
if( !v29 )
v8 = v31;
LODWORD(v32) = MiSearchNumaNodeTable((PVOID)(v28 - PfnDb));
v33 = *(unsigned int *)(v32 + 8);
PfnChannel = MiGetPfnChannel((INT64)v28);
if( (_DWORD)v33 != v5 || PfnChannel != PreferredChannel && (_DWORD)v40 )
{
LODWORD(v35) = MiNodeFreeZeroPages(&v10->Core.NodeInformation[v33], PfnChannel, 0x1000ui64);
if( v35 >= 0x200 )
{
LODWORD(v36) = MiSwapNumaStandbyPage(v27, v5, PreferredChannel, 0x30ui64);
if( v36 == v27 )
{
v45 = 1;
}
else
{
v27 = v36;
v28 = &MmGetPfnDb()[v36];
v8 &= ~0x400u;
}
}
else
{
--v4;
}
}
v37 = MiLockPageInline(v28);
v28->u2._bf_0 |= 0x4000000000000000ui64;
MiInsertPageInFreeOrZeroedList(v27, v8, v38, v39, v40, PageFrameIndex);
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v37);
if( v45 == 1 )
break;
PfnDb = MmGetPfnDb();
}
while( v4 < v47 );
}
}Referenced by:
MiRebalanceZeroFreeLists