MiScrubNodeLargePages
VOID __stdcall MiScrubNodeLargePages(
VOID *OpaqueParameter,
_MI_PARTITION *Partition,
UINT64 PreferredNode,
_KEVENT *StopEvent){
__int64 v4;
__int64 *v6;
_MI_NODE_INFORMATION *v7;
unsigned __int64 v8;
_MI_NODE_INFORMATION *v9;
__int64 v10;
unsigned __int64 v11;
int v12;
unsigned int NextPageColor;
int v14;
unsigned int *v15;
unsigned int v16;
_MI_NODE_INFORMATION *v17;
int v18;
_MMLISTS i;
unsigned int j;
int k;
_QWORD *v22;
unsigned int v23;
_QWORD *v24;
unsigned int v25;
NTSTATUS v26;
INT64 v27;
INT64 v28;
UINT64 *NumberOfPages;
int v30;
unsigned int v31;
unsigned int m;
int v33;
unsigned __int64 v34;
unsigned __int64 v35;
unsigned __int64 v36;
_MI_NODE_INFORMATION *v37;
unsigned int *v38;
_KEVENT *v39;
_MI_COLOR_BASE ColorBase[4];
INT64 v41[16];
v4 = (unsigned int)PreferredNode;
v39 = (_KEVENT *)OpaqueParameter;
*(_OWORD *)ColorBase = 0i64;
memset(v41, 0i64, sizeof(v41));
v6 = MiLargePageSizes;
v7 = &Partition->Core.NodeInformation[v4];
v8 = 0i64;
v37 = v7;
v9 = v7;
v10 = 3i64;
do
{
v11 = v9->FreeLargePages[0].LargePageFreeCount[0] + v9->FreeLargePages[0].LargePageFreeCount[1];
if( v11 )
v8 += *v6 * v11;
v9 = (_MI_NODE_INFORMATION *)((char *)v9 + 1072);
++v6;
--v10;
}
while( v10 );
v35 = v8;
if( v8 )
{
v12 = 0;
v34 = 0i64;
v30 = 0;
MiInitializePageColorBase(0i64, (unsigned int)(v4 + 1), ColorBase);
NextPageColor = MiGetNextPageColor((INT64)ColorBase);
if( MiCreateUltraThreadContext((INT64)v41, NextPageColor, (unsigned int)(v14 + 7)) )
{
v15 = (unsigned int *)((char *)&stru_140C4DB30 + 400);
v16 = 0;
v38 = (unsigned int *)((char *)&stru_140C4DB30 + 400);
v17 = v7;
do
{
if( v17->FreeLargePages[0].LargePageFreeCount[0] + v17->FreeLargePages[0].LargePageFreeCount[1] )
{
v18 = 0;
v33 = 0;
v31 = *v15;
do
{
for( i = FreePageList; ; --i )
{
if( i == ZeroedPageList && !v12 )
{
_InterlockedIncrement(&Partition->Zeroing.BackgroundZeroingDisabled);
v30 = 1;
}
for( j = 0; j < MmNumberOfChannels; ++j )
{
for( k = 0; k <= 3; ++k )
{
LODWORD(v28) = k;
LODWORD(v27) = i;
LODWORD(v22) = MiGetLargePageListHeadBase((unsigned int)v18, (INT64)v7, v16, j, v27, v28);
v23 = v31;
v24 = v22;
v25 = 0;
for( m = 0; v25 < v23; m = v25 )
{
if( (_QWORD *)*v24 != v24 )
{
LODWORD(NumberOfPages) = k;
v36 = v35 - v34;
LODWORD(v28) = j;
v26 = MiScrubNodeLargePageList(
Partition,
(unsigned int)v4,
v16,
(_MI_MEMORY_HIGHLOW)v18,
i,
v28,
NumberOfPages,
&v36,
v39);
v34 += v36;
if( v34 >= v35 || !v26 )
goto LABEL_29;
v18 = v33;
v25 = m;
v23 = v31;
}
++v25;
v24 += 3;
}
v7 = v37;
}
}
v12 = v30;
if( i == ZeroedPageList )
break;
}
v33 = ++v18;
}
while( v18 <= 1 );
v15 = v38;
}
++v15;
++v16;
v17 = (_MI_NODE_INFORMATION *)((char *)v17 + 1072);
v38 = v15;
}
while( v16 < 3 );
LABEL_29:
if( v30 == 1 )
_InterlockedDecrement(&Partition->Zeroing.BackgroundZeroingDisabled);
MiDeleteUltraThreadContext((INT64)v41);
}
}
}Referenced by:
MiScrubNode