MiGetPageTablePages
VOID __fastcall MiGetPageTablePages(
_MI_ZERO_PAGE_TABLE_CREATION *PageTableCreation,
VOID *RealVa,
UINT64 PageTableCount,
_MI_SYSTEM_VA_TYPE SystemVaType){
_MI_ZERO_PAGE_TABLE_CREATION v4;
_MI_PARTITION *v5;
_MMPFN *v9;
int v10;
unsigned int v11;
unsigned __int32 v12;
__int64 v13;
_MMPFN *v14;
_MMPFN *bf_0;
unsigned __int64 v16;
v4 = PageTableCreation[16];
v5 = (_MI_PARTITION *)*((_QWORD *)PageTableCreation + 4);
*(_QWORD *)PageTableCount = 0i64;
v9 = 0i64;
if( (v4 & 8) != 0 || !v5->Vp.TotalCommitLimit )
{
v10 = 0;
}
else
{
if( !MiObtainSystemCharges(v5, (UINT64)RealVa, (unsigned int)PageTableCreation[14]) )
return;
*((_QWORD *)PageTableCreation + 5) += RealVa;
v10 = 1;
v4 = PageTableCreation[16];
}
v16 = 0i64;
v11 = (v4 & 0x400 | 0x20C280u) >> 6;
if( RealVa )
{
while( 1 )
{
v12 = PageTableCreation[71] | _InterlockedExchangeAdd(*((volatile signed __int32 **)PageTableCreation + 34), 1u) & PageTableCreation[70];
LODWORD(v13) = MiGetPage((ULONG_PTR *)&v5->Core.PartitionId, v12, v11);
if( v13 == -1 )
{
if( (PageTableCreation[16] & 0x10) == 0 )
break;
if( !MiSufficientAvailablePages((INT64)v5, 0x60ui64) )
break;
LODWORD(v13) = MiGetPage((ULONG_PTR *)&v5->Core.PartitionId, v12, v11 | 4);
if( v13 == -1 )
break;
}
v14 = &MmGetPfnDb()[v13];
MiSetPfnTbFlushStamp(v14, 0i64, 0i64);
v14->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v9;
++v16;
v9 = v14;
if( v16 >= (unsigned __int64)RealVa )
goto LABEL_8;
}
if( v10 )
{
MiReturnCommit(v5, (UINT64)RealVa);
MiReturnSystemCharges((INT64)v5, (UINT64)RealVa, (unsigned int)PageTableCreation[14]);
*((_QWORD *)PageTableCreation + 5) -= RealVa;
}
if( v9 )
{
do
{
bf_0 = (_MMPFN *)v9->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
MiReleaseFreshPage(v9);
v9 = bf_0;
}
while( bf_0 );
}
}
else
{
LABEL_8:
*(_QWORD *)PageTableCount = v9;
}
}Referenced by:
MiCreateSystemPageTable
MiDemoteValidLargePageOneLevel
MmCreateShadowMapping