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