MiHotAddPartitionMemory

__int64 __fastcall MiHotAddPartitionMemory(unsigned __int64 a1, unsigned __int64 *a2, int *a3){
  int updated; 
  int v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  int v15; 
  _QWORD *v16; 
  int v17; 
  _QWORD *i; 
  _QWORD **v19; 
  __int64 v20; 
  _QWORD *v21; 
  _QWORD *v22; 
  int v23; 
  __int128 v24; 
  __int128 v25; 
  __int128 v26; 
  __int128 v27; 
  __int128 v28; 
  __int64 v29; 
  int v30; 
  _QWORD *v31; 
  v31 = 0i64;
  v29 = 0i64;
  v24 = 0i64;
  v25 = 0i64;
  v26 = 0i64;
  v27 = 0i64;
  v28 = 0i64;
  if( (ULONG_PTR *)a1 == &MiSystemPartition && (*a3 & 4) == 0 )
  {
    updated = -1073741637;
LABEL_4:
    MiFreePartitionTree(a1, (unsigned __int64 *)&v31, 0, 0);
    return(unsigned int)updated;
  }
  if( *((_BYTE *)KeGetCurrentThread() + 562) )
  {
    updated = -1073741727;
    goto LABEL_4;
  }
  *((_QWORD *)a3 + 1) = 0i64;
  v8 = *a3;
  v9 = a3[1];
  if( (*a3 & 1) != 0 )
  {
    v30 = 1;
  }
  else
  {
    if( (*(_DWORD *)(a1 + 4) & 0x40) != 0 || (v8 & 4) != 0 )
    {
      updated = -1073741584;
      goto LABEL_4;
    }
    v30 = 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 || (*a3 & 4) != 0 && ((v13 & 0x3FFFF) != 0 || (v14 & 0x3FFFF) != 0) )
        break;
      v11 += v14;
      if( !MiAddRangeToPartitionTree((unsigned __int64 *)&v31, v13, v14, 0) )
      {
        updated = -1073741670;
        goto LABEL_4;
      }
      ++v12;
      a2 += 2;
      if( v12 >= v9 )
      {
        v8 = *a3;
        goto LABEL_24;
      }
    }
    updated = -1073741811;
    goto LABEL_4;
  }
LABEL_24:
  if( (v8 & 4) != 0 )
  {
    BYTE2(v27) = 1;
    if( (v8 & 2) != 0 )
      BYTE3(v27) = 1;
  }
  else
  {
    updated = MiUpdatePartitionLargePfnBitMap(a1, &v31);
    if( updated < 0 )
      goto LABEL_4;
  }
  updated = 0;
  v15 = DWORD2(v25);
  if( (*(_DWORD *)(a1 + 4) & 0x40) != 0 )
  {
    v15 = DWORD2(v25) | 8;
    BYTE1(v27) = 1;
    DWORD2(v25) |= 8u;
  }
  if( v30 )
  {
    v16 = v31;
    v17 = 0;
    i = 0i64;
    *(_QWORD *)&v26 = a1;
    while( v16 )
    {
      i = v16;
      v16 = (_QWORD *)*v16;
    }
    while( i )
    {
      v19 = (_QWORD **)i[1];
      v20 = (__int64)i;
      v21 = i;
      if( v19 )
      {
        v22 = *v19;
        for( i = (_QWORD *)i[1]; v22; v22 = (_QWORD *)*v22 )
          i = v22;
      }
      else
      {
        while( 1 )
        {
          i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
          if( !i || (_QWORD *)*i == v21 )
            break;
          v21 = i;
        }
      }
      if( v17 == 1 )
      {
        RtlAvlRemoveNode((unsigned __int64 *)&v31, (__int64 *)v20);
        ExFreePoolWithTag(*(PVOID *)(v20 + 40), 0);
        ExFreePoolWithTag((PVOID)v20, 0);
      }
      else
      {
        MiActOnPartitionNodePages(v20, 9u, (__int16 **)&v26);
        if( (SDWORD1(v27) & 0x80000000) != 0 )
        {
          updated = DWORD1(v27);
          v17 = 1;
          if( RtlAreBitsClearEx(v20 + 32, 0i64, 0x40000ui64) )
            i = (_QWORD *)v20;
        }
      }
    }
    v11 = *((_QWORD *)&v28 + 1);
    if( !*((_QWORD *)&v28 + 1) )
      goto LABEL_4;
  }
  else
  {
    v15 |= 2u;
    DWORD2(v25) = v15;
  }
  v23 = *a3;
  if( (*a3 & 2) == 0 )
    DWORD2(v25) = v15 | 1;
  *(_QWORD *)&v24 = &v31;
  if( (v23 & 4) != 0 )
    MiFreePartitionTree(a1, (unsigned __int64 *)&v31, 0, 0);
  else
    MiInsertPartitionPages((unsigned __int64)&MiSystemPartition, a1, (__int64)&v24, v11, 0i64);
  *((_QWORD *)a3 + 1) = v11;
  return(unsigned int)updated;
}

Referenced by:

MmManagePartitionInitialAddMemory