MmAllocateIndependentPagesEx

INT64 __fastcall MmAllocateIndependentPagesEx(UINT64 a1, INT64 a2, _QWORD *a3, UINT64 a4){
  int v4; 
  UINT64 v6; 
  INT64 v7; 
  UINT64 ValidPte; 
  INT64 v9; 
  UINT64 v10; 
  UINT64 v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  unsigned int NextPageColor; 
  UINT64 v16; 
  UINT64 SlabPage; 
  unsigned int v19; 
  _QWORD *v20; 
  INT64 v21; 
  __int64 v22; 
  __int64 v23; 
  INT64 v24[2]; 
  UINT64 v25[4]; 
  __int128 v26; 
  BOOL v27; 
  unsigned int v28; 
  v28 = a4;
  v4 = a2;
  v6 = (a1 >> 12) + ((a1 & 0xFFF) != 0);
  *(_OWORD *)v24 = 0i64;
  memset(v25, 0, sizeof(v25));
  v26 = 0i64;
  v7 = MiReservePtes((INT64)&qword_140C4EC80, (unsigned int)v6);
  if( !v7 )
    return 0i64;
  if( !(unsigned int)MiObtainPoolCharges(v6, 1i64) )
  {
    MiReleasePtes((INT64)&qword_140C4EC80, v7, (unsigned int)v6);
    return 0i64;
  }
  v27 = a3 && (dword_140C50AC4 & 8) != 0 && (v4 == -1 || KeNumberNodes == 1);
  v23 = ((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  ValidPte = MiMakeValidPte(v7, 0i64, 2684354564i64);
  v9 = 0i64;
  v10 = ValidPte;
  if( v4 != -1 )
    v9 = (unsigned int)(v4 + 1);
  MiInitializePageColorBase(0i64, v9, (INT64)v24);
  v11 = 0i64;
  v22 = 0i64;
  do
  {
    v12 = 0;
    NextPageColor = MiGetNextPageColor((INT64)v24);
    if( v27 )
    {
      if( a3 != (_QWORD *)-1i64 )
      {
        v19 = 0;
        if( !v28 )
          goto LABEL_9;
        v20 = a3;
        while( v13 != *v20 >> 12 )
        {
          v19 += v14;
          ++v20;
          if( v19 >= v28 )
            goto LABEL_9;
        }
      }
      v12 = v14;
    }
LABEL_9:
    while( 1 )
    {
      if( v12 )
      {
        LODWORD(v21) = 0;
        SlabPage = MiGetSlabPage((UINT64)&MiSystemPartition, v14, 0i64, (INT64 *)0xFFFFFFFFFFFFFFFFi64, v21);
        if( SlabPage != -1i64 )
          break;
      }
      SlabPage = MiGetPage((_MI_PARTITION *)&MiSystemPartition, NextPageColor, 8ui64);
      if( SlabPage != -1i64 )
        goto LABEL_11;
      MiWaitForFreePage((_MI_PARTITION *)&MiSystemPartition, v16);
      LOBYTE(v14) = 1;
    }
    ++v11;
LABEL_11:
    v10 ^= (v10 ^ (SlabPage << 12)) & 0xFFFFFFFFF000i64;
    MiInitializePfn((_RTL_BITMAP_EX *)MmGetPfnDb() + 3 * SlabPage, (UINT64 *)v7, 4ui64);
    *(_QWORD *)v7 = v10;
    v7 += 8i64;
    ++v22;
    --v6;
  }
  while( v6 );
  if( v11 )
  {
    v25[3] = v11;
    v25[0] = v11;
    *(_OWORD *)&v25[1] = 0i64;
    v26 = 0i64;
    MiReturnPoolCharges(v25, 1i64);
  }
  return v23;
}

Referenced by:

ExCreatePoolTagTable
HvlInitializeProcessor
HvlpPreallocatePageListResources
IopLiveDumpAllocateDumpBuffers
IopLiveDumpAllocateExtraBuffers
IopLiveDumpAllocateIptBuffers
KeStartAllProcessors
KiStartDynamicProcessor
MmAllocateIndependentPages
MmAllocateIsrStack
PspInitPhase0