MiGetPageTablePages
__int64 __fastcall MiGetPageTablePages(__int64 a1, unsigned __int64 a2, _QWORD *a3){
int v3;
INT64 v4;
_MMPFN *v8;
int v9;
unsigned int v10;
unsigned __int32 v11;
UINT64 Page;
_MMPFN *v13;
_MMPFN *v15;
unsigned __int64 v16;
v3 = *(_DWORD *)(a1 + 64);
v4 = *(_QWORD *)(a1 + 32);
*a3 = 0i64;
v8 = 0i64;
if( (v3 & 8) != 0 || !*(_QWORD *)(v4 + 7592) )
{
v9 = 0;
}
else
{
if( !(unsigned int)MiObtainSystemCharges((_MI_PARTITION *)v4, a2, *(unsigned int *)(a1 + 56)) )
return 3221225773i64;
*(_QWORD *)(a1 + 40) += a2;
v9 = 1;
v3 = *(_DWORD *)(a1 + 64);
}
v16 = 0i64;
v10 = (v3 & 0x400 | 0x20C280u) >> 6;
if( a2 )
{
while( 1 )
{
v11 = *(_DWORD *)(a1 + 284) | _InterlockedExchangeAdd(*(volatile signed __int32 **)(a1 + 272), 1u) & *(_DWORD *)(a1 + 280);
Page = MiGetPage((_MI_PARTITION *)v4, v11, v10);
if( Page == -1i64 )
{
if( (*(_DWORD *)(a1 + 64) & 0x10) == 0 )
break;
if( !(unsigned int)MiSufficientAvailablePages(v4, 0x60ui64) )
break;
Page = MiGetPage((_MI_PARTITION *)v4, v11, v10 | 4);
if( Page == -1i64 )
break;
}
v13 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * Page);
MiSetPfnTbFlushStamp(v13, 0i64, 0i64);
*(_QWORD *)v13 = v8;
++v16;
v8 = v13;
if( v16 >= a2 )
goto LABEL_8;
}
if( v9 )
{
MiReturnCommit((_MI_PARTITION *)v4, a2);
MiReturnSystemCharges(v4, a2, *(unsigned int *)(a1 + 56));
*(_QWORD *)(a1 + 40) -= a2;
}
if( v8 )
{
do
{
v15 = *(_MMPFN **)v8;
MiReleaseFreshPage(v8);
v8 = v15;
}
while( v15 );
}
return 3221225495i64;
}
else
{
LABEL_8:
*a3 = v8;
return 0i64;
}
}Referenced by:
MiCreateSystemPageTable
MiDemoteValidLargePageOneLevel
MmCreateShadowMapping