MiMoveLargeFreePage
UINT64 __stdcall MiMoveLargeFreePage(UINT64 PageFrameIndex, UINT64 LargePageIndex, _MI_PARTITION *FromPartition){
UINT64 *v3;
unsigned int v5;
UINT64 *v6;
__int64 v7;
UINT64 v8;
UINT64 result;
char *v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
_DWORD SpinCount[7];
v5 = 0;
v6 = v3;
v7 = MiLargePageSizes[(unsigned int)LargePageIndex];
v8 = PageFrameIndex & ~(v7 - 1);
result = MiTryUnlinkNodeLargePage((UINT64)FromPartition, v8);
if( (_DWORD)result )
{
v10 = (char *)MmGetPfnDb() + 48 * v8;
v11 = *((_QWORD *)v10 + 2);
*(_QWORD *)&SpinCount[1] = 0i64;
*(_QWORD *)&SpinCount[5] = (unsigned __int8)MiLockPageInline((INT64)v10);
*(_QWORD *)&SpinCount[3] = (v11 & 0x3E0) != 0;
v12 = (*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64;
*(_QWORD *)&SpinCount[1] = v8;
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * v12) == FromPartition )
{
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
v13 = (unsigned __int64)&v10[48 * v7 - 48];
if( v13 >= (unsigned __int64)v10 )
{
v14 = v13 + 24;
v15 = (unsigned __int64)(*(_WORD *)v6 & 0x3FF) << 39;
do
{
SpinCount[0] = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v14, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)SpinCount);
while( *(__int64 *)v14 < 0 );
}
if( (*(_BYTE *)(v14 + 11) & 0x40) != 0 )
MiMoveBadPageCrossPartition(v13, (INT64)FromPartition, v6);
*(_QWORD *)(v14 + 16) = v15 | *(_QWORD *)(v14 + 16) & 0xFFFE007FFFFFFFFFui64;
if( (char *)v13 != v10 )
_InterlockedAnd64((volatile signed __int64 *)v14, 0x7FFFFFFFFFFFFFFFui64);
v13 -= 48i64;
v14 -= 48i64;
}
while( v13 >= (unsigned __int64)v10 );
}
v5 = 1;
}
MiInsertLargePageInNodeList((INT64)&SpinCount[1]);
return v5;
}
return result;
}Referenced by:
MiTransferPartitionPageRun