MiGetLargePagesDemoteAsNeeded
NTSTATUS __stdcall MiGetLargePagesDemoteAsNeeded(
INT64 a1,
UINT64 a2,
UINT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7){
int v7;
INT64 v8;
__int64 v9;
unsigned int v10;
unsigned int v11;
__int64 v12;
int v13;
__int64 *v14;
unsigned int v15;
_QWORD *v16;
UINT64 v17;
unsigned int v18;
INT64 v19;
INT64 LargePage;
signed __int32 v21;
INT64 v22;
__int64 v23;
UINT64 v25;
INT64 v26;
INT64 v27;
INT64 v28;
_MI_COLOR_BASE ColorBase[4];
UINT64 v31;
UINT64 v32;
v32 = a4;
v31 = a3;
v7 = a2;
v8 = a1;
v9 = *(_QWORD *)(a1 + 16) + 4544i64 * (unsigned int)a2;
if( !*(_QWORD *)(v9 + 4176) && (_DWORD)InitializationPhase )
{
LABEL_22:
LODWORD(LargePage) = 0;
}
else
{
v10 = a6;
v11 = 0;
v12 = 0i64;
v13 = !(a6 & 1) + 1;
if( (a6 & 1) == 0 )
v10 = a6 | 1;
while( 1 )
{
v14 = MiLargePageSizes;
v15 = 0;
v16 = (_QWORD *)(v9 + 16 * (v12 + 1));
do
{
v17 = *v14;
if( a3 >= *v14 )
{
if( v17 < a4 )
break;
v18 = v15;
if( v11 )
v18 = v11;
v11 = v18;
if( v16[1] || *v16 )
{
if( (_DWORD)a5 )
v19 = a3 / v17;
else
v19 = 1i64;
LODWORD(v28) = a7;
LODWORD(v27) = 4;
LODWORD(v26) = 0;
LODWORD(v25) = v7;
LODWORD(LargePage) = MiGetFreeZeroLargePages(v8, v15, v19, v10, v25, v26, v27, v28);
if( LargePage )
return LargePage;
v8 = a1;
a3 = v31;
a4 = v32;
}
}
++v15;
++v14;
v16 += 134;
}
while( v15 < 3 );
if( v11 )
{
*(_OWORD *)ColorBase = 0i64;
MiInitializePageColorBase(0i64, (unsigned int)(v7 + 1), ColorBase);
v21 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
LargePage = MiGetLargePage(
v22,
v11,
(_MI_PFN_CACHE_ATTRIBUTE)a7,
ColorBase[3] | (unsigned int)v21 & ColorBase[2],
v10,
v23);
if( LargePage )
break;
}
if( !--v13 )
goto LABEL_22;
v8 = a1;
v10 &= ~1u;
a3 = v31;
v12 = 1i64;
a4 = v32;
}
}
return LargePage;
}Referenced by:
MiFindLargeNodePage
MiGetFastLargePages
MiGetLargePageChain
MiTimeSingleLargePageZeroWorker