MiHotAddPartitionMemory

NTSTATUS __fastcall MiHotAddPartitionMemory(_MI_PARTITION *ToPartition, UINT64 *a2, INT64 *a3){
  int updated; 
  int v8; 
  unsigned int v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  UINT64 v13; 
  UINT64 v14; 
  int v15; 
  int v16; 
  _RTL_BALANCED_NODE *Root; 
  int v18; 
  _RTL_BITMAP_EX *v19; 
  unsigned __int64 *Buffer; 
  _RTL_BITMAP_EX *v21; 
  _RTL_BITMAP_EX *v22; 
  _RTL_BITMAP_EX *v23; 
  char v24; 
  int v25; 
  _MI_INSERT_PAGES InsertInfo[4]; 
  __int128 v27; 
  __int128 v28; 
  __int128 v29; 
  __int128 v30; 
  __int64 v31; 
  int v32; 
  _RTL_AVL_TREE PageRoot; 

  PageRoot.Root = 0i64;
  v31 = 0i64;
  *(_OWORD *)InsertInfo = 0i64;
  v27 = 0i64;
  v28 = 0i64;
  v29 = 0i64;
  v30 = 0i64;
  if( ToPartition == &Irp && (*(_DWORD *)a3 & 4) == 0 )
  {
    updated = -1073741637;
LABEL_4:
    MiFreePartitionTree(ToPartition, &PageRoot, 0i64);
    return updated;
  }
  if( KeGetCurrentThread()->PreviousMode )
  {
    updated = -1073741727;
    goto LABEL_4;
  }
  a3[1] = 0i64;
  v8 = *(_DWORD *)a3;
  v9 = *((_DWORD *)a3 + 1);
  if( (*(_DWORD *)a3 & 1) != 0 )
  {
    v32 = 1;
  }
  else
  {
    if( (ToPartition->Core.u.LongFlags & 0x40) != 0 || (v8 & 4) != 0 )
    {
      updated = -1073741584;
      goto LABEL_4;
    }
    v32 = 0;
  }
  v10 = 0i64;
  v11 = 0i64;
  v12 = 0;
  if( v9 )
  {
    while( 1 )
    {
      v13 = *a2;
      if( *a2 < v10 )
        break;
      v14 = a2[1];
      v10 = v14 + v13;
      if( v14 + v13 <= v13
        || v14 + v11 <= v11
        || (*(_DWORD *)a3 & 4) != 0 && ((v13 & 0x3FFFF) != 0 || (v14 & 0x3FFFF) != 0) )
      {
        break;
      }
      v11 += v14;
      MiAddRangeToPartitionTree(&PageRoot, v13, v14, 0i64);
      if( !v15 )
      {
        updated = -1073741670;
        goto LABEL_4;
      }
      ++v12;
      a2 += 2;
      if( v12 >= v9 )
      {
        v8 = *(_DWORD *)a3;
        goto LABEL_24;
      }
    }
    updated = -1073741811;
    goto LABEL_4;
  }
LABEL_24:
  if( (v8 & 4) != 0 )
  {
    BYTE2(v29) = 1;
    if( (v8 & 2) != 0 )
      BYTE3(v29) = 1;
  }
  else
  {
    updated = MiUpdatePartitionLargePfnBitMap(ToPartition, &PageRoot);
    if( updated < 0 )
      goto LABEL_4;
  }
  updated = 0;
  v16 = DWORD2(v27);
  if( (ToPartition->Core.u.LongFlags & 0x40) != 0 )
  {
    v16 = DWORD2(v27) | 8;
    BYTE1(v29) = 1;
    DWORD2(v27) |= 8u;
  }
  if( v32 )
  {
    Root = PageRoot.Root;
    v18 = 0;
    v19 = 0i64;
    *(_QWORD *)&v28 = ToPartition;
    while( Root )
    {
      v19 = (_RTL_BITMAP_EX *)Root;
      Root = Root->Children[0];
    }
    while( v19 )
    {
      Buffer = v19->Buffer;
      v21 = v19;
      v22 = v19;
      if( Buffer )
      {
        v23 = (_RTL_BITMAP_EX *)*Buffer;
        v19 = (_RTL_BITMAP_EX *)v19->Buffer;
        if( *Buffer )
        {
          do
          {
            v19 = v23;
            v23 = (_RTL_BITMAP_EX *)v23->SizeOfBitMap;
          }
          while( v23 );
        }
      }
      else
      {
        while( 1 )
        {
          v19 = (_RTL_BITMAP_EX *)(v19[1].SizeOfBitMap & 0xFFFFFFFFFFFFFFFCui64);
          if( !v19 || (_RTL_BITMAP_EX *)v19->SizeOfBitMap == v22 )
            break;
          v22 = v19;
        }
      }
      if( v18 == 1 )
      {
        RtlAvlRemoveNode((UINT64 *)&PageRoot, (INT64 *)v21);
        ExFreePoolWithTag(v21[2].Buffer, 0);
        ExFreePoolWithTag(v21, 0);
      }
      else
      {
        MiActOnPartitionNodePages((__int64)v21, 9u, (_RTL_AVL_TREE **)&v28);
        if( (SDWORD1(v29) & 0x80000000) != 0 )
        {
          updated = DWORD1(v29);
          RtlAreBitsClearEx(v21 + 2, 0i64, 0x40000ui64);
          v18 = 1;
          if( v24 == 1 )
            v19 = v21;
        }
      }
    }
    v11 = *((_QWORD *)&v30 + 1);
    if( !*((_QWORD *)&v30 + 1) )
      goto LABEL_4;
  }
  else
  {
    v16 |= 2u;
    DWORD2(v27) = v16;
  }
  v25 = *(_DWORD *)a3;
  if( (*(_DWORD *)a3 & 2) == 0 )
    DWORD2(v27) = v16 | 1;
  *(_QWORD *)InsertInfo = &PageRoot;
  if( (v25 & 4) != 0 )
    MiFreePartitionTree(ToPartition, &PageRoot, 0i64);
  else
    MiInsertPartitionPages(&Irp, ToPartition, InsertInfo);
  a3[1] = v11;
  return updated;
}

Referenced by:

MmManagePartitionInitialAddMemory