MmAllocateNonChargedSecurePages
VOID __fastcall MmAllocateNonChargedSecurePages(UINT64 **a1, UINT64 *a2, INT64 *a3){
UINT64 v5;
UINT64 v6;
unsigned int v7;
signed __int32 v8;
unsigned int v9;
INT64 SlabPage;
char *v11;
unsigned __int64 v12;
INT64 v13;
__int128 v14;
v14 = 0i64;
LODWORD(v5) = MiPartitionObjectToPartition(a1);
v6 = v5;
v7 = 0;
MiInitializePageColorBase(0i64, 0i64, (INT64)&v14);
if( *(_DWORD *)a2 )
{
do
{
v8 = _InterlockedExchangeAdd((volatile signed __int32 *)v14, 1u);
v9 = DWORD2(v14) & v8 | HIDWORD(v14);
if( (*(_DWORD *)(v6 + 4) & 8) != 0 )
{
LODWORD(v13) = 0;
SlabPage = MiGetSlabPage(v6, 24, 0i64, (INT64 *)0xFFFFFFFFFFFFFFFFi64, v13);
}
else
{
SlabPage = -1i64;
}
if( SlabPage == -1 )
{
SlabPage = MiGetPage((_MI_PARTITION *)v6, v9, 0i64);
if( SlabPage == -1 )
break;
}
v11 = (char *)MmGetPfnDb() + 48 * SlabPage;
*(_QWORD *)v11 = 0i64;
*((_QWORD *)v11 + 2) = ZeroPte;
*((_QWORD *)v11 + 5) = *((_QWORD *)v11 + 5) & 0x7FFFFFF000000000i64 | 0xFFFFFFFFDi64;
_InterlockedIncrement64((volatile signed __int64 *)(v6 + 432));
v12 = (unsigned __int8)MiLockPageInline((INT64)v11);
MiInitializeMdlPfn((INT64)v11, 131584i64);
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
*a3 = SlabPage;
++v7;
++a3;
}
while( v7 < *(_DWORD *)a2 );
}
*(_DWORD *)a2 = v7;
}Referenced by:
PspIumReplenishPartitionPages