MiCoalesceFreeLargePages
VOID __stdcall MiCoalesceFreeLargePages(INT64 rcx0, INT64 rdx0, UINT64 a3){
unsigned __int64 v3;
unsigned __int64 v4;
__int64 v5;
INT64 v6;
INT64 v7;
UINT8 v8;
unsigned int v9;
unsigned __int64 v10;
INT64 v11;
int v12;
int v13;
unsigned int v14;
__int128 *v15;
int v16;
_MI_PFN_CACHE_ATTRIBUTE v17;
__int64 v18;
unsigned int v19;
_MI_PFN_CACHE_ATTRIBUTE v20;
unsigned int v21;
unsigned int v22;
_MMPFN *v23;
__int64 v24;
INT64 v25;
INT64 v26;
int v27;
int v28;
__int64 v29;
unsigned __int64 j;
unsigned int LargePageIndex;
int v33;
INT64 i;
INT64 v35;
INT64 v36;
INT64 CurrentThread;
__int128 v38;
LargePageIndex = a3;
v36 = rcx0;
v3 = MiLargePageSizes[(unsigned int)a3];
v4 = MiLargePageSizes[(unsigned int)(a3 - 1)];
LODWORD(v35) = a3 - 1;
v38 = 0i64;
v5 = (__int64)&MmGetPfnDb()[rdx0];
v6 = rdx0;
v33 = 0;
v7 = v5;
i = v5;
v8 = 17;
CurrentThread = (INT64)KeGetCurrentThread();
--*(_WORD *)(CurrentThread + 486);
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(rcx0 + 192), 0i64);
v9 = 0;
v10 = v4 / v3;
if( v4 / v3 )
{
v11 = v36;
do
{
MiIsPfn(v6);
if( !v12 )
break;
LOBYTE(v13) = MiLargePfnPromoteCandidate(v11, v7);
if( !v13 )
break;
++v9;
v6 += v3;
++*((_DWORD *)&v38 + ((unsigned __int64)*(unsigned __int8 *)(v7 + 34) >> 6));
v7 += 48 * v3;
}
while( v9 < v10 );
v5 = i;
v8 = 17;
}
if( v9 == v10 )
{
v14 = 0;
v15 = &v38;
v16 = 0;
v17 = MiCached;
LODWORD(v18) = 0;
do
{
v19 = *(_DWORD *)v15;
v20 = v17;
v21 = v14;
if( *(_DWORD *)v15 && v14 )
v16 = 1;
v17 = (int)v18;
v14 = *(_DWORD *)v15;
if( v21 >= v19 )
v17 = v20;
v18 = (unsigned int)(v18 + 1);
v15 = (__int128 *)((char *)v15 + 4);
if( v21 >= v19 )
v14 = v21;
}
while( (unsigned int)v18 < 4 );
if( v16 && (v22 = 0, v23 = (_MMPFN *)v5, v10) )
{
while( MiChangePageAttributeLargeFreeZeroPage(v23, LargePageIndex, v17) )
{
++v22;
v23 += v3;
if( v22 >= v10 )
goto LABEL_21;
}
}
else
{
LABEL_21:
v24 = 0i64;
v25 = rdx0;
v26 = v5;
for( i = rdx0; (unsigned int)v24 < v10; i += v3 )
{
MiIsPfn(v25);
if( !v27 )
break;
if( v26 == v5 )
{
v8 = MiLockPageInline((_MMPFN *)v26);
}
else if( _interlockedbittestandset64((volatile signed __int32 *)(v26 + 24), 0x3Fui64) )
{
break;
}
LOBYTE(v28) = MiLargePfnPromoteCandidate(v36, v26);
if( !v28 || *(unsigned __int8 *)(v26 + 34) >> 6 != v17 )
{
_InterlockedAnd64((volatile signed __int64 *)(v26 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( v26 == v5 )
__writecr8(v8);
break;
}
v24 = (unsigned int)(v24 + 1);
v26 += 48 * v3;
v25 = v3 + i;
}
if( (unsigned int)v24 == v10 )
{
MiLargePagePromote(rdx0, LargePageIndex, v18, &v33);
v29 = v5 + 48 * v3;
}
else
{
v29 = v5 & -(__int64)((_DWORD)v24 != 0);
}
if( (_DWORD)v24 )
{
for( j = v5 + v3 * (48 * v24 - 48); j != v29; j -= 48 * v3 )
_InterlockedAnd64((volatile signed __int64 *)(j + 24), 0x7FFFFFFFFFFFFFFFui64);
_InterlockedAnd64((volatile signed __int64 *)(j + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v8);
}
if( v33 )
MiChangePageHeatImmediate(rdx0, (unsigned int)v35, 0i64);
}
}
MiUnlockDynamicMemoryShared(v36, CurrentThread);
}Referenced by:
MiRebuildLargeZeroPage