HvReallocateCell

UINT64 __stdcall HvReallocateCell(
        PVOID Hive,
        PVOID Cell,
        UINT64 NewSize,
        UINT8 FreeOldCell,
        VOID **CellAddress,
        _HV_GET_CELL_CONTEXT *CellAddressContext){
  int v6; 
  __int64(__fastcall *v7)(PVOID, PVOID, _HV_GET_CELL_CONTEXT *); 
  VOID *v8; 
  ULONG_PTR v10; 
  VOID *v12; 
  const VOID *v13; 
  unsigned int v14; 
  unsigned int v15; 
  int v16; 
  _HV_GET_CELL_CONTEXT *v17; 
  UINT64 v18; 
  unsigned int v19; 
  int v20; 
  size_t v21; 
  VOID *v22; 
  _HV_GET_CELL_CONTEXT *v23; 
  _HV_GET_CELL_CONTEXT v24; 
  _HV_GET_CELL_CONTEXT v26; 
  VOID *v27; 
  _HV_GET_CELL_CONTEXT v28; 

  v6 = NewSize;
  *(_DWORD *)&v28.BinContext._bf_0 = 0;
  v7 = (__int64(__fastcall *)(PVOID, PVOID, _HV_GET_CELL_CONTEXT *))*((_QWORD *)Hive + 1);
  v8 = 0i64;
  v26 = (_HV_GET_CELL_CONTEXT)0xFFFFFFFFi64;
  v10 = (unsigned int)Cell;
  v28.Cell = -1;
  v27 = 0i64;
  v12 = (VOID *)v7(Hive, Cell, &v26);
  v13 = v12;
  if( v12 )
  {
    v15 = v6 + 4;
    v16 = -4 - *((_DWORD *)v12 - 1);
    if( v15 > -*((_DWORD *)v12 - 1) )
    {
      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((ULONG_PTR)Hive, v18, v10 >> 31, &v27, &v28);
        if( v14 == -1 )
        {
          v8 = v27;
          v14 = -1;
        }
        else
        {
          v21 = v16;
          v22 = v27;
          memmove(v27, v13, v21);
          (*((void(__fastcall **)(PVOID, _HV_GET_CELL_CONTEXT *))Hive + 2))(Hive, &v26);
          v13 = 0i64;
          if( FreeOldCell == 1 )
            HvFreeCell((ULONG_PTR)Hive, v10);
          v23 = CellAddressContext;
          *CellAddress = v22;
          v24 = v28;
          *((_WORD *)&v28.BinContext + 1) = 0;
          v28.Cell = -1;
          *v23 = v24;
          v28.BinContext = 0;
        }
      }
      else
      {
        v14 = -1;
      }
      if( v13 )
        (*((void(__fastcall **)(PVOID, _HV_GET_CELL_CONTEXT *))Hive + 2))(Hive, &v26);
      if( v8 )
        (*((void(__fastcall **)(PVOID, _HV_GET_CELL_CONTEXT *))Hive + 2))(Hive, &v28);
    }
    else
    {
      v14 = v10;
      v17 = CellAddressContext;
      *CellAddress = v12;
      *v17 = v26;
    }
  }
  else
  {
    return(unsigned int)-1;
  }
  return v14;
}

Referenced by:

CmRestoreKey
CmpAddToLeaf
CmpAddValueToListEx
CmpRemoveValueFromList
CmpSetValueDataExisting
CmpSetValueKeyExisting
CmpSplitLeaf