MmAllocateNonChargedSecurePages
VOID __stdcall MmAllocateNonChargedSecurePages(UINT64 **a1, UINT64 *a2, INT64 *a3){
INT64 v5;
INT64 v6;
unsigned int v7;
signed __int32 v8;
unsigned int v9;
INT64 v10;
INT64 v11;
INT64 v12;
_MMPFN *v13;
unsigned __int64 v14;
UINT64 v15;
__int128 ColorBase;
ColorBase = 0i64;
LODWORD(v5) = MiPartitionObjectToPartition(a1);
v6 = v5;
v7 = 0;
MiInitializePageColorBase(0i64, 0i64, (_MI_COLOR_BASE *)&ColorBase);
if( *(_DWORD *)a2 )
{
do
{
v8 = _InterlockedExchangeAdd((volatile signed __int32 *)ColorBase, 1u);
v9 = DWORD2(ColorBase) & v8 | HIDWORD(ColorBase);
if( (*(_DWORD *)(v6 + 4) & 8) != 0 )
{
LODWORD(v15) = 0;
LODWORD(v10) = MiGetSlabPage(v6, 0x18ui64, 0i64, (INT64 *)0xFFFFFFFFFFFFFFFFi64, v15);
v11 = v10;
}
else
{
v11 = -1i64;
}
if( v11 == -1 )
{
LODWORD(v12) = MiGetPage((ULONG_PTR *)v6, v9, 0i64);
v11 = v12;
if( v12 == -1 )
break;
}
v13 = &MmGetPfnDb()[v11];
v13->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
v13->OriginalPte = ZeroPte;
v13->u4._bf_0 = v13->u4._bf_0 & 0x7FFFFFF000000000i64 | 0xFFFFFFFFDi64;
_InterlockedIncrement64((volatile signed __int64 *)(v6 + 432));
v14 = MiLockPageInline(v13);
MiInitializeMdlPfn(v13, 0x20200ui64);
_InterlockedAnd64(&v13->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
*a3 = v11;
++v7;
++a3;
}
while( v7 < *(_DWORD *)a2 );
}
*(_DWORD *)a2 = v7;
}Referenced by:
PspIumReplenishPartitionPages