MiGetLargePage
INT64 __fastcall MiGetLargePage(
INT64 a1,
unsigned int a2,
_MI_PFN_CACHE_ATTRIBUTE a3,
unsigned int a4,
int a5,
__int64 a6){
unsigned int v7;
unsigned int v9;
INT64 v10;
unsigned __int8 CurrentIrql;
unsigned int v12;
INT64 v13;
UINT8 *v14;
INT64 v15;
_BOOL4 v17;
__int64 v18;
UINT64 v19;
INT64 v20;
INT64 v21;
INT64 v22;
_MI_PFN_CACHE_ATTRIBUTE v23;
UINT64 v24[3];
INT64 v25[18];
v23 = a3;
v7 = a4;
*(UINT64 *)((char *)&v24[1] + 4) = a6;
LODWORD(v24[0]) = a4;
memset(v25, 0i64, sizeof(v25));
v9 = v7 >> *(&stru_140C4DB30 + 156);
v10 = *(_QWORD *)(a1 + 16) + 4544i64 * (v7 >> *(&stru_140C4DB30 + 156));
if( !*(_QWORD *)(v10 + 4176) && (MiFlags & 0x30) != 0 )
return 0i64;
CurrentIrql = KeGetCurrentIrql();
v12 = a2 + 1;
while( 1 )
{
--v12;
LODWORD(v22) = v23;
LODWORD(v21) = 4;
LODWORD(v20) = v7;
LODWORD(v19) = v9;
LODWORD(v13) = MiGetFreeZeroLargePages(a1, v12, 1i64, a5 | 0x20u, v19, v20, v21, v22);
v15 = v13;
if( v13 )
break;
v7 = v24[0];
if( !v12 )
return 0i64;
}
v17 = (*(_DWORD *)(v13 + 16) & 0x3E0i64) != 0;
HIDWORD(v24[0]) = v17;
if( v12 == a2 )
{
MiLargePageMovesComplete(a1, v9, v14);
}
else
{
MiInsertDemotedPages(v10, v13, v12, a2, v13);
LODWORD(v24[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v15 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(v24);
while( *(__int64 *)(v15 + 24) < 0 );
}
_InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
__writecr8(CurrentIrql);
v18 = (v15 - (__int64)MmGetPfnDb()) / 48;
if( !v17 && (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
MiArePageContentsZero((PVOID)v18);
MiIsFreeZeroPfnCold(v15);
if( HIDWORD(v24[0]) == 1 )
{
if( HIDWORD(v25[0]) )
MiNotifyPageHeat(v25);
if( v12 == 3 )
MiZeroPhysicalPage(v18, 0i64, v23);
else
MiZeroLargePage((_MI_ZERO_THREAD_CONTEXT *)v15);
*(_MMPTE *)(v15 + 16) = ZeroPte;
}
return v15;
}Referenced by:
MiGetClusterPage
MiGetLargePagesDemoteAsNeeded
MiGetPageChain
MiIdealClusterPage
MiPrefetchPreallocatePages
MiProcessVaContiguityInformation
MiResolvePrivateZeroFault