MiAllocatePartitionPhysicalPages

INT64 __stdcall MiAllocatePartitionPhysicalPages(
        _MI_PARTITION *Partition,
        _MI_PARTITION *ToPartition,
        INT64 NumberOfPages,
        INT64 RequiredNode,
        INT64 Flags,
        INT64 a6){
  int v6; 
  _MI_PARTITION *v7; 
  unsigned int IdealNode; 
  INT64 v9; 
  INT64 HugeRangeFromNode; 
  unsigned __int64 v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  unsigned __int64 v17; 
  BOOL v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  __int64 v23; 
  BOOL IsZeroed; 
  unsigned int v25; 
  _MMPFN *LargeNodePage; 
  unsigned __int64 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  int updated; 
  UINT64 v31; 
  char v32; 
  _LARGE_INTEGER v33; 
  int v34; 
  unsigned int v35; 
  unsigned __int64 v36; 
  unsigned __int64 v37; 
  _MDL *PagesForMdl; 
  MDL *v39; 
  int v40; 
  _MI_PARTITION *v41; 
  __int32 v42; 
  UINT64 PfnState; 
  UINT64 v44; 
  _MI_PARTITION *a1; 
  int v46; 
  int v47; 
  LONG SpinLock[2]; 
  __int64 v49; 
  unsigned __int64 v50; 
  unsigned int v51; 
  unsigned __int64 v52; 
  __m256i v53; 
  UINT64 LargePageIndex; 
  _MI_PARTITION *v55; 
  INT64 v56; 
  int v57; 
  v56 = NumberOfPages;
  v55 = ToPartition;
  v6 = *((_DWORD *)ToPartition + 1);
  v7 = (_MI_PARTITION *)&MiSystemPartition;
  IdealNode = RequiredNode;
  v51 = RequiredNode;
  v9 = NumberOfPages;
  *(_QWORD *)SpinLock = 0i64;
  HugeRangeFromNode = 0i64;
  v49 = 0i64;
  if( Partition )
    v7 = Partition;
  v11 = 0i64;
  a1 = v7;
  v47 = Flags & 4;
  v12 = ((v6 & 0x40) == 0) | 0x100000;
  v13 = v12 | 0x8000;
  *(_OWORD *)v53.m256i_i8 = 0i64;
  if( (Flags & 4) == 0 )
    v13 = v12;
  v14 = v13 | 0x4000;
  *(_OWORD *)&v53.m256i_u64[2] = 0i64;
  if( (Flags & 0x12) != 0 )
    v14 = v13;
  v15 = Flags & 0x200;
  v57 = v15;
  v46 = v14;
  if( (Flags & 0x200) == 0 )
  {
    if( (MiAcquireNonPagedResources(v7, NumberOfPages) & 0x80000000) != 0i64 )
      return 3221225626i64;
    v7 = a1;
    v9 = v56;
  }
  v50 = 0x40000i64;
  while( 1 )
  {
    v17 = v9 - v11;
    v52 = v9 - v11;
    if( v9 - v11 < 0x200 )
      goto LABEL_39;
    v18 = 1;
    if( (Flags & 0x60) == 0 )
      v18 = v17 < 0x40000;
    HugeRangeFromNode &= 0xFFFFFFFFFFFC0000ui64;
    LODWORD(LargePageIndex) = v18;
    v19 = 0;
    if( v15 )
    {
      v20 = 0;
      if( KeNumberNodes )
      {
        do
        {
          HugeRangeFromNode = MiGetHugeRangeFromNode(a1, v20, (v14 & 1) == 0);
          if( (HugeRangeFromNode & 0x3FFFF) != 0 || (Flags & 1) == 0 )
            break;
          v21 = v20 + 1;
          v22 = 0;
          if( v21 != (unsigned __int16)KeNumberNodes )
            v22 = v21;
          v20 = v22 + 1;
        }
        while( v20 < (unsigned __int16)KeNumberNodes );
        IdealNode = v51;
        v17 = v52;
        v9 = v56;
      }
      if( (HugeRangeFromNode & 0x3FFFF) == 0 )
        goto LABEL_38;
      v23 = (unsigned __int64)(HugeRangeFromNode & 0x3FFFF) << 18;
      LODWORD(LargePageIndex) = 0;
      IsZeroed = MiHugeRangeIsZeroed(HugeRangeFromNode);
      v19 = v25;
      LOBYTE(v19) = IsZeroed;
    }
    else
    {
      LODWORD(PfnState) = v14;
      LargeNodePage = MiFindLargeNodePage(v7, IdealNode, &LargePageIndex, 1ui64, PfnState);
      if( !LargeNodePage )
      {
        v9 = v56;
        goto LABEL_39;
      }
      v23 = (LargeNodePage - MmGetPfnDb()) / 48;
      if( (*((_DWORD *)LargeNodePage + 4) & 0x3E0i64) != 0 )
      {
        if( (v14 & 1) != 0 )
          goto LABEL_30;
        MiZeroLargePage((INT64)LargeNodePage, (unsigned int)LargePageIndex, 1i64);
      }
      v19 = 1;
    }
LABEL_30:
    v27 = MiLargePageSizes[(unsigned int)LargePageIndex];
    if( !MiAddRangeToPartitionTree((unsigned __int64 *)SpinLock, v23, v27, v19) )
      break;
    v7 = a1;
    v15 = v57;
    if( a1 == (_MI_PARTITION *)&MiSystemPartition && !v57 )
      _InterlockedExchangeAdd64(&qword_140C4ECF8, v27);
    v9 = v56;
    v11 += v27;
    if( v11 == v56 )
      goto LABEL_48;
    v14 = v46;
  }
  if( v57 )
  {
    MiInsertHugeRangeInList(HugeRangeFromNode, v19, 0i64);
    v9 = v56;
LABEL_38:
    v15 = v57;
LABEL_39:
    v28 = v49;
    goto LABEL_40;
  }
  v31 = MiFreeMdlPageRun(v23, v27, v19);
  v9 = v56;
  v28 = v31;
  v15 = v57;
LABEL_40:
  if( v11 == v9 )
  {
    v7 = a1;
  }
  else
  {
    v29 = (unsigned __int64)a1;
    if( v15 || (MiReleaseNonPagedResources(a1, v17 - v28), (Flags & 0xA2) != 0) || v28 )
    {
      updated = -1073741670;
      goto LABEL_74;
    }
    v9 = v56;
    v7 = a1;
  }
LABEL_48:
  v32 = Flags;
  v33.QuadPart = 0i64;
  v34 = v46 & 1 | 2;
  if( (Flags & 1) != 0 )
    v34 = v46 & 1;
  v35 = v34 | 0x10;
  if( (Flags & 0x10) != 0 )
  {
    v35 |= 0x40u;
    v33.QuadPart = 0x200000i64;
    v36 = 0x40000i64;
  }
  else
  {
    if( (Flags & 0x40) != 0 )
    {
      v35 |= 0x40u;
      v36 = 512i64;
      v33.QuadPart = 0x200000i64;
    }
    else if( (Flags & 0x100) != 0 )
    {
      v35 |= 0x40u;
      v36 = 0x40000i64;
      v33.QuadPart = 0x40000000i64;
    }
    else
    {
      v36 = 1048574i64;
    }
    v50 = v36;
  }
  if( v11 == v9 )
  {
LABEL_71:
    v40 = v57;
    v41 = v55;
    if( !v57 )
    {
      updated = MiUpdatePartitionLargePfnBitMap((__int64)v55, (_QWORD **)SpinLock);
      if( updated < 0 )
        goto LABEL_73;
    }
    v53.m256i_i64[0] = (__int64)SpinLock;
    v42 = 3;
    *(_OWORD *)&v53.m256i_u64[1] = 0i64;
    if( (v32 & 8) != 0 )
      v42 = 7;
    v53.m256i_i32[6] = v42;
    if( v40 )
      v53.m256i_i32[6] = v42 | 0x10;
    return(unsigned int)MiInsertPartitionPages(
                           (unsigned __int64)a1,
                           (unsigned __int64)v41,
                           (__int64)&v53,
                           v11,
                           (unsigned int)a6);
  }
  while( 2 )
  {
    v37 = v36;
    LODWORD(v44) = v35;
    if( v9 - v11 <= v36 )
      v37 = v9 - v11;
    PagesForMdl = MiAllocatePagesForMdl(
                    v7,
                    (_LARGE_INTEGER)(-(__int64)(v47 != 0) & 0x100000000i64),
                    (_LARGE_INTEGER)-1i64,
                    v33,
                    v37 << 12,
                    MiCached,
                    IdealNode,
                    v44);
    v39 = PagesForMdl;
    if( !PagesForMdl )
    {
      if( (v35 & 0x40) == 0 )
        goto LABEL_70;
      v35 = v35 & 0xFFFFFF9F | 0x20;
      goto LABEL_67;
    }
    if( (unsigned int)MiAddMdlToPartitionTree(SpinLock, (INT64)PagesForMdl) )
    {
      v11 += (unsigned __int64)v39->ByteCount >> 12;
      ExFreePoolWithTag(v39, 0);
LABEL_67:
      v9 = v56;
      if( v11 == v56 )
        goto LABEL_71;
      v7 = a1;
      v36 = v50;
      continue;
    }
    break;
  }
  MiFreePagesFromMdl(v39, 0i64);
  ExFreePoolWithTag(v39, 0);
LABEL_70:
  updated = -1073741670;
LABEL_73:
  v29 = (unsigned __int64)a1;
LABEL_74:
  MiFreePartitionTree(v29, (unsigned __int64 *)SpinLock, 1, 1);
  return(unsigned int)updated;
}

Referenced by:

MiReleasePartitionHugeIoSpace
MmManagePartitionMoveMemory