MiDemoteLocalLargePage
NTSTATUS __stdcall MiDemoteLocalLargePage(INT64 rcx0, UINT64 a2, INT64 er8, UINT64 a4){
__int16 v4;
unsigned int v7;
unsigned int v8;
UINT64 v9;
int v10;
unsigned int v11;
unsigned int v12;
unsigned __int8 CurrentIrql;
unsigned int v14;
INT64 v15;
INT64 v16;
unsigned __int64 v18;
int v19;
_LIST_ENTRY **v20;
UINT64 v21;
INT64 v22;
INT64 v23;
INT64 v24;
unsigned int v25;
unsigned int v26;
_MI_NODE_INFORMATION *v27;
v4 = er8;
v26 = a2;
if( (er8 & 1) != 0 )
return 0;
v7 = 0;
v25 = 0;
if( (unsigned int)MmNumberOfChannels > 1 )
{
v7 = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> *(&stru_140C4DB30 + 157));
v25 = v7;
}
v8 = (unsigned int)a2 >> *(&stru_140C4DB30 + 156);
v27 = (_MI_NODE_INFORMATION *)(*(_QWORD *)(rcx0 + 16) + 4544i64 * ((unsigned int)a2 >> *(&stru_140C4DB30 + 156)));
LODWORD(v9) = MiNodeFreeZeroPages(v27, v7, (unsigned int)er8);
if( v9 >= a4 )
return 0;
if( (v4 & 0x400) != 0 )
{
v10 = 0;
}
else
{
v10 = 1;
if( (v4 & 0x800) != 0 )
v10 = 2;
}
v11 = 3;
v12 = (2 * (v4 & 2)) | 9;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
while( 1 )
{
v14 = v12;
LODWORD(v24) = v10;
v12 |= 0x20u;
LODWORD(v23) = v7;
if( --v11 )
v12 = v14;
LODWORD(v22) = v26;
LODWORD(v21) = v8;
LODWORD(v15) = MiGetFreeZeroLargePages(rcx0, v11, 1i64, v12, v21, v22, v23, v24);
v16 = v15;
if( v15 )
break;
v7 = v25;
if( !v11 )
{
if( (v12 & 1) == 0 )
{
__writecr8(CurrentIrql);
return 0;
}
v11 = 3;
v12 &= 0xFFFFFFDE;
}
}
if( (v12 & 0x20) != 0 )
{
MiInsertDemotedPages((INT64)v27, v15, v11, 1i64, v15);
v11 = 1;
}
v18 = *(_QWORD *)(rcx0 + 7104);
if( v18 )
--v18;
if( v18 >= 0x9F
|| (v19 = *(_DWORD *)&KeGetCurrentThread()[1].gapD8[12], (v19 & 0xC) == 8)
|| (v18 >= 0x20 || (_MI_PARTITION *)rcx0 != &Irp)
&& ((v19 & 2) != 0 && v18 >= 0x21 || (*(_DWORD *)(rcx0 + 4) & 0x20) != 0) )
{
v20 = (_LIST_ENTRY **)(v16 + 48 * (v26 & (unsigned __int64)(MiLargePageSizes[v11] - 1)));
}
else
{
v20 = 0i64;
}
MiIsFreeZeroPfnCold(v16);
MiConvertEntireLargePageToSmall(
(_KQUEUE *)v16,
v11,
1u,
(_LARGE_INTEGER *)((*(_DWORD *)(v16 + 16) & 0x3E0i64) != 0),
v20,
0i64);
__writecr8(CurrentIrql);
return(int)v20;
}Referenced by:
MiGetFreeOrZeroPageAnyColor