MiLargePagePromote
INT64 __fastcall MiLargePagePromote(INT64 a1, UINT64 a2, INT64 a3, _DWORD *a4){
__int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
int v7;
char v8;
char *v9;
unsigned int v10;
__int64 v11;
UINT8 v12;
unsigned int v14;
unsigned __int64 v15;
__int64 v16;
unsigned int PfnChannel;
char v18;
char v19;
char *v20;
INT64 v21;
int v22;
__int64 v23;
_MI_NODE_INFORMATION *NodeInformation;
unsigned __int64 v25;
INT64 a1a;
int v27;
int v28;
__int16 v29;
int v30;
__int16 v31;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned int LargePageIndex;
int v35;
LargePageIndex = a2;
v4 = (unsigned int)(a2 - 1);
v30 = 0;
v31 = 0;
v5 = MiLargePageSizes[(unsigned int)a2];
v6 = MiLargePageSizes[v4];
v7 = 0;
v25 = v6;
v8 = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
*a4 = 0;
v35 = 0;
v9 = (char *)MmGetPfnDb() + 48 * a1;
v23 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v9 + 5) >> 39) & 0x3FFi64));
MiPageToNode(48 * a1 / 48, (__int64)((unsigned __int128)(48 * a1 * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3);
v11 = 4544i64 * v10;
NodeInformation = (_MI_NODE_INFORMATION *)(v11 + *(_QWORD *)(v23 + 16));
KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)NodeInformation + 541, &LockHandle, v12);
if( *((_QWORD *)NodeInformation + 544) )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
return 0i64;
}
++*(_DWORD *)(v11 + *(_QWORD *)(v23 + 16) + 4284);
v14 = 0;
v15 = v6 / v5;
if( v15 )
{
v16 = 48 * v5;
do
{
PfnChannel = MiGetPfnChannel((INT64)v9);
MiUnlinkNodeLargePageHelper(NodeInformation, (_MMPFN *)v9, LargePageIndex, PfnChannel);
v8 |= ((*((_DWORD *)v9 + 4) & 0x3E0) != 0i64) + 1;
v7 |= 2 - MiIsFreeZeroPfnCold((INT64)v9);
v18 = v9[39] & 0xFC;
if( v14 )
{
v19 = v9[34] & 0xFE;
v9[39] = v18;
v9[34] = v19 | 6;
}
else
{
v9[39] = v18 | ~(_BYTE)v4 & 3;
}
++v14;
v9 += v16;
}
while( v14 < v15 );
}
v20 = &v9[-48 * v25];
if( (v8 & 2) == 0 )
{
if( (v7 & 2) != 0 && (unsigned int)MiColdPageSizeSupported() )
{
*a4 = 1;
}
else
{
if( !(unsigned int)MiDetermineNewPfnHeatState(0i64) )
goto LABEL_11;
if( (v7 & 1) == 0 )
goto LABEL_13;
}
v21 = 4294967293i64;
goto LABEL_12;
}
v35 = 1;
LABEL_11:
v21 = 0i64;
LABEL_12:
*((_QWORD *)v20 + 2) = MiUpdatePageFileHighInPte(*((_QWORD *)v20 + 2), v21);
LABEL_13:
a1a = a1;
v27 = v35;
v30 = v22;
v31 = v22;
v28 = 6;
v29 = 258;
MiInsertLargePageInNodeList((INT64)&a1a);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
return 1i64;
}Referenced by:
MiCoalesceFreeLargePages