MiReplenishPageSlist
VOID __fastcall MiReplenishPageSlist(INT64 a1, INT64 a2, UINT64 a3){
int v3;
__int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
__int64 v8;
UINT64 v9;
unsigned __int64 v10;
__int64 v11;
UINT64 v12;
_QWORD *v13;
__int64 v14;
__int64 v15;
_MMPFN *PfnDb;
INT64 v17;
struct _SLIST_ENTRY *v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
volatile signed __int32 *v22;
unsigned int v23;
unsigned int v24;
unsigned __int64 v25;
int v26;
__int64 v27;
unsigned __int64 v28;
bool v29;
unsigned __int64 v30;
int v31;
unsigned int v32;
unsigned int v33;
_QWORD *v34;
UINT64 v35;
volatile signed __int64 *v36;
__int64 v37;
__int64 v38;
struct _SLIST_ENTRY *List;
_QWORD *v40;
INT64 v41[2];
__int128 v42[8];
v3 = *(_DWORD *)(a1 + 4);
v32 = a3;
v5 = (int)a2;
*(_OWORD *)v41 = 0i64;
memset(v42, 0, sizeof(v42));
if( (v3 & 0x20) == 0 )
{
v37 = 16i64 * (unsigned int)a3;
v38 = *(_QWORD *)(a1 + 8i64 * (int)a2 + 4200);
v6 = *(unsigned __int16 *)(v37 + v38);
v7 = *(unsigned int *)(a1 + 6300);
v8 = (unsigned int)a3;
if( v6 < v7 )
{
v9 = (int)v7 - v6;
v10 = v9 + 64;
v40 = (_QWORD *)(*(_QWORD *)(a1 + 16) + 4544 * ((unsigned __int64)(unsigned int)a3 >> byte_140C4DBCC));
v33 = (unsigned __int8)(MiChannelMaximumPowerOf2Mask & ((unsigned int)a3 >> byte_140C4DBCD));
if( (_DWORD)a2 )
{
v11 = *(_QWORD *)(a1 + 2184);
v36 = (volatile signed __int64 *)(a1 + 2304);
if( MiNodeFreeZeroPages(v40, v33, 4096) < v10 )
return;
}
else
{
v11 = *(_QWORD *)(a1 + 2176);
v36 = (volatile signed __int64 *)(a1 + 2240);
if( MiNodeFreeZeroPages(v40, v33, 4098) < v10 || *(_BYTE *)(a1 + 4829) == 1 )
return;
}
v12 = *(_QWORD *)(v11 + 40 * v8);
v13 = (_QWORD *)(v11 + 40 * v8);
v34 = v13;
if( v9 <= v12 )
v12 = v9;
if( *(_QWORD *)(a1 + 7104) - v12 >= 0x420 )
{
LODWORD(v41[1]) = 16;
v31 = HvlEnlightenments & 0x200000;
v14 = 0i64;
if( !(unsigned int)MiDecreaseAvailablePages((_MI_PARTITION *)a1, v12, 0x420ui64, 0i64) )
goto LABEL_58;
v15 = v13[2];
PfnDb = MmGetPfnDb();
v17 = (INT64)PfnDb + 48 * v15;
v35 = v12;
v18 = 0i64;
List = (struct _SLIST_ENTRY *)v17;
while( 1 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)(v17 + 24), 0x3Fui64) )
{
v26 = HIDWORD(v41[0]);
LABEL_50:
v12 -= v14;
if( v14 )
{
if( v26 )
{
LODWORD(v41[0]) = 1;
MiNotifyPageHeat(v41);
}
v34[2] = v15;
if( v15 == 0xFFFFFFFFFi64 )
{
MiUpdateZeroFreeBitmap(a1, (unsigned int)v5, v32, 0i64);
v34[3] = 0xFFFFFFFFFi64;
}
else
{
MiSetPfnBlink((_MMPFN *)v17, 0xFFFFFFFFFui64, 0i64);
}
InterlockedPushListSList((PSLIST_HEADER)(v37 + v38), List, v18, v14);
*v34 -= v14;
v30 = -v14;
_InterlockedExchangeAdd64(v36, v30);
_InterlockedExchangeAdd64(&v40[v5 + 516], v30);
if( (unsigned int)MmNumberOfChannels > 1 )
_InterlockedExchangeAdd64(&v40[2 * v33 + 527 + v5], v30);
}
LABEL_58:
if( v12 )
MiIncreaseAvailablePages((_MI_PARTITION *)a1, v12);
return;
}
v18 = (struct _SLIST_ENTRY *)v17;
if( !(_DWORD)v5 && (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
{
MiArePageContentsZero((PVOID)((v17 - (__int64)PfnDb) / 48));
PfnDb = MmGetPfnDb();
}
if( dword_140C4E40C == 1 )
{
LOBYTE(v19) = 1;
v20 = (v17 - (__int64)PfnDb) / 48;
v21 = (((((unsigned __int128)((v17 - (__int64)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) & 0x8000000000000000ui64) != 0i64)
+ (unsigned __int8)((__int64)((unsigned __int128)((v17 - (__int64)PfnDb)
* (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3)) & 0x1F;
v22 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v20 >> 5));
if( (unsigned __int64)(v21 + 1) > 0x20 )
{
if( v21 )
{
v24 = 32 - (v20 & 0x1F);
_InterlockedOr(v22++, ((1 << v24) - 1) << v21);
v19 = 1i64 - v24;
if( v19 >= 0x20 )
{
v25 = v19 >> 5;
v19 += -32i64 * (v19 >> 5);
do
{
*v22++ = -1;
--v25;
}
while( v25 );
}
if( !v19 )
goto LABEL_28;
}
v23 = (1 << v19) - 1;
}
else
{
v23 = 1 << v21;
}
_InterlockedOr(v22, v23);
}
LABEL_28:
*(_BYTE *)(v17 + 34) = *(_BYTE *)(v17 + 34) & 0xF8 | 5;
if( (*(_BYTE *)(v17 + 34) & 8) != 0 )
MiPageListCollision(v17);
*(_QWORD *)(v17 + 24) &= 0xFFFFFFF000000000ui64;
_InterlockedAnd64((volatile signed __int64 *)(v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( v31 && MiIsFreeZeroPfnCold(v17) )
{
v26 = HIDWORD(v41[0]);
if( HIDWORD(v41[0]) < 0x10 )
{
*((_QWORD *)v42 + HIDWORD(v41[0])) = v15 << 12;
v26 = ++HIDWORD(v41[0]);
}
}
else
{
v26 = HIDWORD(v41[0]);
}
v15 = *(_QWORD *)v17 & 0xFFFFFFFFFi64;
PfnDb = MmGetPfnDb();
if( v15 == 0xFFFFFFFFFi64 )
v17 = 0i64;
else
v17 = (INT64)PfnDb + 48 * v15;
v27 = (__int64)v18[1].Next ^ (LODWORD(v18[1].Next) ^ ((_DWORD)v5 << 12)) & 0xF000;
if( v27 && qword_140C4DC80 )
{
if( (v27 & 0x10) != 0 )
LODWORD(v27) = v27 & 0xFFFFFFEF;
else
LODWORD(v27) = ~(_DWORD)qword_140C4DC80 & v27;
}
v28 = (unsigned int)v27 | 0xFFFFFFFE00000000ui64;
if( qword_140C4DC80 )
{
if( (qword_140C4DC80 & v28) != 0 )
v28 = (unsigned int)v27 | 0xFFFFFFFE00000010ui64;
else
v28 |= qword_140C4DC80;
}
++v14;
v18[1].Next = (_SLIST_ENTRY *)v28;
v29 = v35-- == 1;
v18->Next = (_SLIST_ENTRY *)v17;
if( v29 )
goto LABEL_50;
}
}
}
}
}Referenced by:
MiGetPage
MiGetPerfectColorHeadPage