HvpGrowDirtyVectors

NTSTATUS __stdcall HvpGrowDirtyVectors(INT64 a1, UINT64 a2){
  NTSTATUS v2; 
  _RTL_BITMAP *v3; 
  UINT32 v4; 
  unsigned int v5; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned int *v11; 
  unsigned int *v12; 
  UINT32 v13; 
  unsigned int *v14; 
  __int64 v15; 
  __int64 v16; 
  _RTL_BITMAP Destination; 
  _RTL_BITMAP BitMapHeader; 
  unsigned int *v19; 

  v2 = 0;
  v3 = (_RTL_BITMAP *)(a1 + 88);
  v4 = *(_DWORD *)(a1 + 88);
  v5 = (unsigned int)a2 >> 9;
  *(&Destination.SizeOfBitMap + 1) = 0;
  *(&BitMapHeader.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);
      v19 = v12;
      if( v12 )
      {
        BitMapHeader.Buffer = v12;
        v13 = v5 - v4;
        Destination.SizeOfBitMap = v5;
        Destination.Buffer = v11;
        BitMapHeader.SizeOfBitMap = v5;
        if( *(_QWORD *)(a1 + 96) )
        {
          RtlCopyBitMap(v3, &Destination, 0i64);
          RtlClearBits(&Destination, v4, v13);
        }
        else
        {
          memset(v11, 0i64, v7);
        }
        if( *(_QWORD *)(a1 + 120) )
        {
          RtlCopyBitMap((_RTL_BITMAP *)(a1 + 112), &BitMapHeader, 0i64);
          RtlClearBits(&BitMapHeader, v4, v13);
          v14 = v19;
        }
        else
        {
          v14 = v19;
          memset(v19, 0i64, v7);
        }
        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 -1073741670;
    }
  }
  else
  {
    v8 = *(_QWORD *)(a1 + 96);
    v3->SizeOfBitMap = v5;
    *(_QWORD *)(a1 + 96) = v8;
    RtlClearBits((PRTL_BITMAP)(a1 + 88), v4, v5 - v4);
    v9 = *(_QWORD *)(a1 + 120);
    *(_DWORD *)(a1 + 112) = v5;
    *(_QWORD *)(a1 + 120) = v9;
    RtlClearBits((PRTL_BITMAP)(a1 + 112), v4, v5 - v4);
  }
  return v2;
}

Referenced by:

HvpAddBin
HvpPerformLogFileRecovery