MiLargePagePromote
__int64 __fastcall MiLargePagePromote(__int64 a1, unsigned int a2, __int64 a3, _DWORD *a4){
__int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
char v7;
char v8;
_MMPFN *v9;
unsigned int v10;
__int64 v11;
unsigned int v13;
unsigned __int64 v14;
__int64 v15;
unsigned int PfnChannel;
int v17;
unsigned __int8 v18;
char v19;
_MMPFN *v20;
INT64 v21;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v22;
int v23;
UINT64 v24;
__int64 v25;
_MI_NODE_INFORMATION *NodeInformation;
unsigned __int64 v27;
__int64 v28;
int v29;
int v30;
__int16 v31;
int v32;
__int16 v33;
_KLOCK_QUEUE_HANDLE LockHandle;
int v37;
v4 = a2 - 1;
v32 = 0;
v33 = 0;
v5 = MiLargePageSizes[a2];
v6 = MiLargePageSizes[v4];
v7 = 0;
v27 = v6;
v8 = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
*a4 = 0;
v37 = 0;
v9 = &MmGetPfnDb()[a1];
v25 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v9->u4._bf_0 >> 39) & 0x3FF));
MiPageToNode(48 * a1 / 48, (__int64)((unsigned __int128)(48 * a1 * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3);
v11 = 4544i64 * v10;
NodeInformation = (_MI_NODE_INFORMATION *)(v11 + *(_QWORD *)(v25 + 16));
KeAcquireInStackQueuedSpinLockAtDpcLevel(&NodeInformation->LargePageLock, &LockHandle);
if( NodeInformation->NumberOfPagesGoingBad )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return 0i64;
}
++*(_DWORD *)(v11 + *(_QWORD *)(v25 + 16) + 4284);
v13 = 0;
v14 = v6 / v5;
if( v14 )
{
v15 = 48 * v5;
do
{
PfnChannel = MiGetPfnChannel((INT64)v9);
LODWORD(v24) = 10;
MiUnlinkNodeLargePageHelper(NodeInformation, v9, a2, PfnChannel, v24);
v8 |= ((*(_DWORD *)(&v9->3 + 1) & 0x3E0) != 0i64) + 1;
LOBYTE(v17) = MiIsFreeZeroPfnCold((INT64)v9);
v7 |= 2 - (v17 != 0);
v18 = v9->ViewCount & 0xFC;
if( v13 )
{
v19 = *(_BYTE *)(&v9->u3 + 1) & 0xFE;
v9->ViewCount = v18;
*((_BYTE *)&v9->u3 + 2) = v19 | 6;
}
else
{
v9->ViewCount = v18 | ~(_BYTE)v4 & 3;
}
++v13;
v9 = (_MMPFN *)((char *)v9 + v15);
}
while( v13 < v14 );
}
v20 = &v9[-v27];
if( (v8 & 2) == 0 )
{
if( (v7 & 2) != 0 && MiColdPageSizeSupported() )
{
*a4 = 1;
}
else
{
if( !MiDetermineNewPfnHeatState(0i64) )
goto LABEL_11;
if( (v7 & 1) == 0 )
goto LABEL_13;
}
v21 = 4294967293i64;
goto LABEL_12;
}
v37 = 1;
LABEL_11:
v21 = 0i64;
LABEL_12:
LODWORD(v22.Long) = MiUpdatePageFileHighInPte(
v20->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
v21);
v20->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v22.Long;
LABEL_13:
v28 = a1;
v29 = v37;
v32 = v23;
v33 = v23;
v30 = 6;
v31 = 258;
MiInsertLargePageInNodeList((__int64)&v28);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
return 1i64;
}Referenced by:
MiCoalesceFreeLargePages