MiDemoteLocalLargePage
INT64 __fastcall MiDemoteLocalLargePage(INT64 a1, UINT64 a2, INT16 a3, UINT64 a4){
int v6;
unsigned int v7;
int v8;
unsigned int v9;
unsigned int v10;
unsigned __int8 CurrentIrql;
unsigned int v12;
INT64 FreeZeroLargePages;
INT64 v14;
unsigned __int64 v16;
int v17;
LIST_ENTRY **v18;
UINT64 v19;
INT64 v20;
INT64 v21;
INT64 v22;
int v23;
unsigned int v24;
_QWORD *v25;
v24 = a2;
if( (a3 & 1) != 0 )
return 0i64;
v6 = 0;
v23 = 0;
if( (unsigned int)MmNumberOfChannels > 1 )
{
v6 = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> byte_140C4DBCD);
v23 = v6;
}
v7 = (unsigned int)a2 >> byte_140C4DBCC;
v25 = (_QWORD *)(*(_QWORD *)(a1 + 16) + 4544i64 * ((unsigned int)a2 >> byte_140C4DBCC));
if( MiNodeFreeZeroPages(v25, v6, a3) >= a4 )
return 0i64;
if( (a3 & 0x400) != 0 )
{
v8 = 0;
}
else
{
v8 = 1;
if( (a3 & 0x800) != 0 )
v8 = 2;
}
v9 = 3;
v10 = (2 * (a3 & 2)) | 9;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
while( 1 )
{
v12 = v10;
LODWORD(v22) = v8;
v10 |= 0x20u;
LODWORD(v21) = v6;
if( --v9 )
v10 = v12;
LODWORD(v20) = v24;
LODWORD(v19) = v7;
FreeZeroLargePages = MiGetFreeZeroLargePages(a1, v9, 1i64, v10, v19, v20, v21, v22);
v14 = FreeZeroLargePages;
if( FreeZeroLargePages )
break;
v6 = v23;
if( !v9 )
{
if( (v10 & 1) == 0 )
{
__writecr8(CurrentIrql);
return 0i64;
}
v9 = 3;
v10 &= 0xFFFFFFDE;
}
}
if( (v10 & 0x20) != 0 )
{
MiInsertDemotedPages((INT64)v25, FreeZeroLargePages, v9, 1i64, FreeZeroLargePages);
v9 = 1;
}
v16 = *(_QWORD *)(a1 + 7104);
if( v16 )
--v16;
if( v16 >= 0x9F
|| (v17 = *((_DWORD *)KeGetCurrentThread() + 325), (v17 & 0xC) == 8)
|| (v16 >= 0x20 || (ULONG_PTR *)a1 != &MiSystemPartition)
&& ((v17 & 2) != 0 && v16 >= 0x21 || (*(_DWORD *)(a1 + 4) & 0x20) != 0) )
{
v18 = (LIST_ENTRY **)(v14 + 48 * (v24 & (unsigned __int64)(MiLargePageSizes[v9] - 1)));
}
else
{
v18 = 0i64;
}
MiIsFreeZeroPfnCold(v14);
MiConvertEntireLargePageToSmall(
(KQUEUE *)v14,
v9,
1u,
(LARGE_INTEGER *)((*(_DWORD *)(v14 + 16) & 0x3E0i64) != 0),
v18,
0i64);
__writecr8(CurrentIrql);
return(INT64)v18;
}Referenced by:
MiGetFreeOrZeroPageAnyColor