HvReallocateCell

INT64 __fastcall HvReallocateCell(UINT64 a1, INT64 a2, INT64 a3, CHAR a4, INT64 *a5, INT64 *a6){
  int v6; 
  __int64(__fastcall *v7)(UINT64, INT64, INT64 *); 
  VOID *v8; 
  unsigned int v10; 
  INT64 v12; 
  UINT8 *v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  INT64 *v17; 
  UINT64 v18; 
  unsigned int v19; 
  int v20; 
  UINT64 v21; 
  VOID *v22; 
  INT64 *v23; 
  _HV_GET_CELL_CONTEXT v24; 
  INT64 v26; 
  VOID *CellAddress; 
  _HV_GET_CELL_CONTEXT CellAddressContext; 
  v6 = a3;
  *(_DWORD *)&CellAddressContext.BinContext = 0;
  v7 = *(__int64(__fastcall **)(UINT64, INT64, INT64 *))(a1 + 8);
  v8 = 0i64;
  v26 = 0xFFFFFFFFi64;
  v10 = a2;
  CellAddressContext.Cell = -1;
  CellAddress = 0i64;
  v12 = v7(a1, a2, &v26);
  v13 = (UINT8 *)v12;
  if( v12 )
  {
    v15 = v6 + 4;
    v16 = -4 - *(_DWORD *)(v12 - 4);
    if( v15 > -*(_DWORD *)(v12 - 4) )
    {
      v18 = 0x4000i64;
      v19 = (v15 + 7) & 0xFFFFFFF8;
      v20 = 0;
      while( v19 > (unsigned int)v18 )
      {
        v18 = (unsigned int)(2 * v18);
        ++v20;
      }
      if( !v20 )
        v18 = v19;
      if( (unsigned int)v18 <= 0x100000 )
      {
        v14 = HvpDoAllocateCell((_HHIVE *)a1, v18, (HSTORAGE_TYPE)(v10 >> 31), &CellAddress, &CellAddressContext);
        if( v14 == -1 )
        {
          v8 = CellAddress;
          v14 = -1;
        }
        else
        {
          v21 = v16;
          v22 = CellAddress;
          memmove((UINT8 *)CellAddress, v13, v21);
          (*(void(__fastcall **)(UINT64, INT64 *))(a1 + 16))(a1, &v26);
          v13 = 0i64;
          if( a4 == 1 )
            HvFreeCell(a1, v10);
          v23 = a6;
          *a5 = (INT64)v22;
          v24 = CellAddressContext;
          *((_WORD *)&CellAddressContext.BinContext + 1) = 0;
          CellAddressContext.Cell = -1;
          *v23 = (INT64)v24;
          CellAddressContext.BinContext = 0;
        }
      }
      else
      {
        v14 = -1;
      }
      if( v13 )
        (*(void(__fastcall **)(UINT64, INT64 *))(a1 + 16))(a1, &v26);
      if( v8 )
        (*(void(__fastcall **)(UINT64, _HV_GET_CELL_CONTEXT *))(a1 + 16))(a1, &CellAddressContext);
    }
    else
    {
      v14 = v10;
      v17 = a6;
      *a5 = v12;
      *v17 = v26;
    }
  }
  else
  {
    return(unsigned int)-1;
  }
  return v14;
}

Referenced by:

CmRestoreKey
CmpAddToLeaf
CmpAddValueToListEx
CmpRemoveValueFromList
CmpSetValueDataExisting
CmpSetValueKeyExisting
CmpSplitLeaf