HvpGrowDirtyVectors

INT64 __fastcall HvpGrowDirtyVectors(INT64 a1, UINT64 a2){
  unsigned int v2; 
  RTL_BITMAP *v3; 
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned int *v11; 
  unsigned int *v12; 
  unsigned int v13; 
  INT64 v14; 
  __int64 v15; 
  __int64 v16; 
  struct _RTL_BITMAP BitMapHeader; 
  RTL_BITMAP Destination; 
  INT64 result; 
  v2 = 0;
  v3 = (RTL_BITMAP *)(a1 + 88);
  v4 = *(_DWORD *)(a1 + 88);
  v5 = (unsigned int)a2 >> 9;
  *(&BitMapHeader.SizeOfBitMap + 1) = 0;
  *(&Destination.SizeOfBitMap + 1) = 0;
  v7 = (((unsigned int)a2 >> 12) + 3) & 0xFFFFFFFC;
  if( *(_DWORD *)(a1 + 108) < v7 )
  {
    v11 = (unsigned int *)(*(__int64(__fastcall **)(_QWORD, _QWORD, __int64))(a1 + 24))(v7, 0i64, 959532355i64);
    if( v11 )
    {
      v12 = (unsigned int *)(*(__int64(__fastcall **)(_QWORD, _QWORD, __int64))(a1 + 24))(v7, 0i64, 959532355i64);
      result = (INT64)v12;
      if( v12 )
      {
        Destination.Buffer = v12;
        v13 = v5 - v4;
        BitMapHeader.SizeOfBitMap = v5;
        BitMapHeader.Buffer = v11;
        Destination.SizeOfBitMap = v5;
        if( *(_QWORD *)(a1 + 96) )
        {
          RtlCopyBitMap(v3, &BitMapHeader, 0i64);
          RtlClearBits(&BitMapHeader, v4, v13);
        }
        else
        {
          memset((INT64)v11, 0i64);
        }
        if( *(_QWORD *)(a1 + 120) )
        {
          RtlCopyBitMap((RTL_BITMAP *)(a1 + 112), &Destination, 0i64);
          RtlClearBits(&Destination, v4, v13);
          v14 = result;
        }
        else
        {
          v14 = result;
          memset(result, 0i64);
        }
        v15 = *(_QWORD *)(a1 + 96);
        if( v15 )
          (*(void(__fastcall **)(__int64, _QWORD))(a1 + 32))(v15, *(unsigned int *)(a1 + 108));
        v16 = *(_QWORD *)(a1 + 120);
        if( v16 )
          (*(void(__fastcall **)(__int64, _QWORD))(a1 + 32))(v16, *(unsigned int *)(a1 + 108));
        v3->SizeOfBitMap = v5;
        v3->Buffer = v11;
        *(_DWORD *)(a1 + 112) = v5;
        *(_QWORD *)(a1 + 120) = v14;
        *(_DWORD *)(a1 + 108) = v7;
      }
      else
      {
        v2 = -1073741670;
        (*(void(__fastcall **)(unsigned int *, _QWORD))(a1 + 32))(v11, v7);
      }
    }
    else
    {
      return(unsigned int)-1073741670;
    }
  }
  else
  {
    v8 = *(_QWORD *)(a1 + 96);
    v3->SizeOfBitMap = v5;
    *(_QWORD *)(a1 + 96) = v8;
    RtlClearBits((RTL_BITMAP *)(a1 + 88), v4, v5 - v4);
    v9 = *(_QWORD *)(a1 + 120);
    *(_DWORD *)(a1 + 112) = v5;
    *(_QWORD *)(a1 + 120) = v9;
    RtlClearBits((RTL_BITMAP *)(a1 + 112), v4, v5 - v4);
  }
  return v2;
}

Referenced by:

HvpAddBin
HvpPerformLogFileRecovery