MiAddPhysicalMemoryChunks

INT64 __stdcall MiAddPhysicalMemoryChunks(_MI_PARTITION *Partition, LARGE_INTEGER *StartAddress, LARGE_INTEGER *a3){
  unsigned int v3; 
  unsigned __int64 QuadPart; 
  LONGLONG v5; 
  unsigned __int64 v6; 
  int v7; 
  int v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  int v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  UINT64 v14; 
  unsigned __int64 v15; 
  int v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  _BOOL8 v19; 
  __int64 v21; 
  unsigned __int64 v22; 
  _LARGE_INTEGER v23; 
  unsigned int LargestPageIndex; 
  unsigned __int64 v25; 
  unsigned int v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  unsigned int v30; 
  int v31; 
  _LARGE_INTEGER NumberOfBytes; 
  unsigned __int64 v33; 
  _LARGE_INTEGER StartAddressa; 
  LARGE_INTEGER *v36; 
  v36 = a3;
  QuadPart = StartAddress->QuadPart;
  v5 = 0i64;
  StartAddressa = *StartAddress;
  v6 = a3->QuadPart;
  v7 = 0;
  v8 = 0;
  v33 = 0i64;
  v9 = v6;
  v10 = v3;
  v11 = 0;
  while( 1 )
  {
    while( 1 )
    {
      v12 = QuadPart >> 12;
      MiRestrictRangeToNode(v12, v6 >> 12);
      v15 = v13;
      if( v12 < 0x100000 && v12 + v13 > 0x100000 )
        v15 = 0x100000 - v12;
      MiPageToNode(v12, v14);
      NumberOfBytes.QuadPart = qword_140C50AD0
                             + 4544i64 * ((unsigned int)MiGetClosestImplicitNode((unsigned int)(v16 + 1)) - 1);
      if( v11 < 0 )
      {
        v15 = v33;
        if( v33 > 0x200 )
          v15 = 512i64;
        switch( v8 )
        {
          case 0:
            if( v33 > 0x200 )
            {
              v7 = 0;
              break;
            }
            LODWORD(v19) = v12 < 0x100000;
            goto LABEL_21;
          case 1:
            v19 = v33 <= 0x200;
LABEL_21:
            v7 = v19 + 1;
            break;
          case 2:
            v7 = 3;
            break;
          case 3:
            v7 = 4;
            break;
          case 4:
            goto LABEL_27;
        }
      }
      else
      {
        v7 = 0;
        LODWORD(v17) = 1;
        if( (v12 & 0x1FF) != 0 )
        {
LABEL_11:
          if( v15 > MiLargePageSizes[(unsigned int)v17] - v12 % MiLargePageSizes[(unsigned int)v17] )
            v15 = MiLargePageSizes[(unsigned int)v17] - v12 % MiLargePageSizes[(unsigned int)v17];
        }
        else
        {
          v18 = 512i64;
          while( v15 >= v18 )
          {
            v15 &= ~(v18 - 1);
            if( !(_DWORD)v17 )
              break;
            v17 = (unsigned int)(v17 - 1);
            v18 = MiLargePageSizes[v17];
            if( v12 % v18 )
              goto LABEL_11;
          }
        }
      }
      v21 = 1i64;
      LargestPageIndex = MiGetLargestPageIndex();
      if( LargestPageIndex <= 1 )
      {
        while( 1 )
        {
          v25 = MiLargePageSizes[LargestPageIndex];
          if( !(v12 % v25) && !(v15 % v25) )
            break;
          if( ++LargestPageIndex > 1 )
            goto LABEL_34;
        }
        v21 = MiLargePageSizes[LargestPageIndex];
      }
LABEL_34:
      v26 = v10 & 0xFFFFA7FF;
      if( v15 >= v22 )
      {
        if( v7 )
        {
LABEL_41:
          if( v7 != 1 || (v27 = MiNodeLargeFreeZeroPages2(v23.QuadPart, 1i64)) == 0 )
          {
            if( v15 != 512 )
              v15 = 512i64;
            goto LABEL_58;
          }
        }
        else
        {
          v27 = MiNodeLargeFreeZeroPages2(v23.QuadPart, 0i64);
          if( !v27 )
          {
            if( v15 + v12 > 0x100000 && v15 > 0x200 )
            {
              LargestPageIndex = 1;
              v15 = 512i64;
              v21 = 512i64;
            }
            v23 = NumberOfBytes;
            v7 = 1;
            goto LABEL_41;
          }
        }
        if( v27 < (unsigned __int64)(48 * v21) >> 12 )
        {
          while( !LargestPageIndex )
          {
            LargestPageIndex = 1;
            v21 = MiLargePageSizes[1];
            if( v27 >= (unsigned __int64)(48 * v21) >> 12 )
              goto LABEL_48;
          }
          v21 = 1i64;
        }
LABEL_48:
        if( v21 != 1 )
        {
          v26 |= 0x4000u;
          if( Partition == (_MI_PARTITION *)&MiSystemPartition )
          {
            if( LargestPageIndex == 1 )
              v26 |= 0x800u;
            else
              v26 |= 0x1000u;
          }
        }
        v28 = v27 << 12;
        v29 = ~(v21 - 1);
        if( v15 > (v29 & (v28 / 0x30)) )
          v15 = v29 & (v28 / 0x30);
      }
LABEL_58:
      v33 = v15;
      v30 = v26 & 0xFFFFDFFF;
      v10 = v26 | 0x2000;
      v8 = v7;
      if( v7 > 2 )
        v10 = v30;
      NumberOfBytes.QuadPart = v15 << 12;
      MiAddPhysicalMemory(Partition, &StartAddressa, &NumberOfBytes, v10);
      v11 = v31;
      if( v31 < 0 )
        break;
      QuadPart = NumberOfBytes.QuadPart + StartAddressa.QuadPart;
      v5 += NumberOfBytes.QuadPart;
      StartAddressa.QuadPart += NumberOfBytes.QuadPart;
      v6 = v9 - v5;
      if( v9 == v5 )
        goto LABEL_27;
    }
    if( v31 != -1073741670 && v31 != -1073741523 || v7 == 4 )
      break;
    QuadPart = StartAddressa.QuadPart;
    v6 = NumberOfBytes.QuadPart;
  }
LABEL_27:
  v36->QuadPart = v5;
  return(unsigned int)v11;
}

Referenced by:

MiActOnPartitionNodePages
MiHotAddBootDeferredDescriptors
MmAddPhysicalMemory