MmAllocateSecureKernelPages
int __fastcall MmAllocateSecureKernelPages(void *a1, __int64 a2, unsigned int a3, int a4, _DWORD *a5){
__int64 v6;
INT64 v7;
INT64 v8;
_MDL *Pool;
PMDL v10;
_MDL *v11;
__int64 v12;
char *v13;
unsigned __int64 v14;
unsigned __int64 v15;
__int64 v16;
unsigned int v17;
_MMPFN *v18;
UINT8 v19;
__int64 bf_0;
UINT64 CacheType;
UINT64 v23;
UINT64 Flags;
UINT8 v25;
int v26;
unsigned int ProtectionMask;
INT64 v28;
char *v29;
PMDL MemoryDescriptorList;
v28 = 0i64;
v6 = a2;
*a5 = 0;
LODWORD(v7) = MiPartitionObjectToPartition(a1);
v8 = v7;
if( v7 )
{
if( (*(_DWORD *)(v7 + 4) & 8) == 0 )
goto LABEL_24;
ProtectionMask = MiMakeProtectionMask(a3);
Pool = (_MDL *)MiAllocatePool(64i64, 8 * v6 + 48, 0x69646D4Dui64);
MemoryDescriptorList = Pool;
v10 = Pool;
if( !Pool )
goto LABEL_24;
v26 = 64;
v11 = Pool + 1;
v12 = 8 * v6;
v13 = (char *)v11;
v14 = (unsigned __int64)&Pool[1] + 8 * v6;
v29 = (char *)v14;
if( (unsigned __int64)v11 < v14 )
{
v15 = v14;
do
{
LODWORD(CacheType) = 0;
LODWORD(v16) = MiGetSlabPage(v8, ProtectionMask, 0i64, &v28, CacheType);
*(_QWORD *)v13 = v16;
if( v16 == -1 )
{
if( !v28 )
break;
v17 = v26;
while( !MiReplenishSlabAllocator(v28, v8, v12 >> 3, v17) )
{
if( v13 != (char *)v11 && !a4 || (v26 & 0x40) == 0 )
goto LABEL_17;
v17 = v26 & 0xFFFFFFBF;
v26 &= ~0x40u;
}
v13 -= 8;
v12 += 8i64;
}
else
{
v18 = &MmGetPfnDb()[v16];
v19 = MiLockPageInline(v18);
bf_0 = v18->u4._bf_0;
v18->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
v25 = v19;
v18->u4._bf_0 = bf_0 & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
v18->OriginalPte = ZeroPte;
MiInitializeMdlPfn(v18, 0x200ui64);
_InterlockedAnd64(&v18->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v25);
}
v13 += 8;
v12 -= 8i64;
}
while( (unsigned __int64)v13 < v15 );
LABEL_17:
v10 = MemoryDescriptorList;
if( v13 != (char *)v11 )
{
MemoryDescriptorList->Next = 0i64;
v10->StartVa = 0i64;
v10->ByteOffset = 0;
v10->ByteCount = (unsigned int)((v13 - (char *)v11) >> 3) << 12;
v10->Size = 8 * (((v13 - (char *)v11) >> 3) + 6);
v10->MdlFlags = 2;
if( !a4 || v13 == v29 )
{
*a5 = 1;
LABEL_25:
LODWORD(v7) = (_DWORD)v10;
return v7;
}
MmFreeSecureKernelPages(v10);
ExFreePoolWithTag(v10, 0);
v6 = a2;
LABEL_24:
LODWORD(Flags) = a4 != 0 ? 517 : 513;
LODWORD(v23) = 0;
LODWORD(v10) = (unsigned int)MmAllocatePartitionNodePagesForMdlEx(
0i64,
(_LARGE_INTEGER)-1i64,
0i64,
v6 << 12,
MmCached,
v23,
Flags,
a1);
goto LABEL_25;
}
v6 = a2;
}
ExFreePoolWithTag(v10, 0);
goto LABEL_24;
}
return v7;
}Referenced by:
PspIumAllocatePartitionState
PspIumAllocatePhysicalPages