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