HvpMarkDirty

CHAR __fastcall HvpMarkDirty(INT64 a1, INT64 a2, INT64 a3){
  unsigned int v3; 
  unsigned int v4; 
  int v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int v9; 
  int v10; 
  int v11; 
  int v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v19; 
  int v20; 
  INT64 v21; 
  __int64 v22; 
  v3 = a3;
  v4 = a2;
  if( (*(_DWORD *)(a1 + 160) & 1) != 0 || (int)a2 < 0 )
    return 1;
  v6 = a2 - 1;
  v7 = a2;
  v8 = *(_DWORD *)(a1 + 136);
  v9 = (unsigned int)(a3 + v6) >> 9;
  v10 = v7 >> 9;
  if( v8 <= 1 )
  {
    v12 = v10;
  }
  else
  {
    v11 = ~(v8 - 1);
    v12 = v10 & v11;
    v9 = (v11 & (v8 + v9)) - 1;
  }
  v13 = ((v9 + 16) & 0xFFFFFFF8) - 9;
  v14 = (v12 + 8) & 0xFFFFFFF8;
  if( v14 )
    v14 -= 8;
  v15 = *(_DWORD *)(a1 + 272) >> 9;
  if( v13 >= v15 )
    v13 = v15 - 1;
  v16 = 0;
  v17 = v14;
  if( v14 > v13 )
    goto LABEL_14;
  do
  {
    if( !_bittest64(*(const signed __int64 **)(a1 + 96), v17) )
      ++v16;
    ++v17;
  }
  while( v17 <= v13 );
  if( !v16 )
  {
LABEL_14:
    if( (*(_DWORD *)(a1 + 160) & 2) == 0 )
    {
      v22 = *(_QWORD *)(a1 + 4176) + 10000000i64 * (unsigned int)CmpLazyFlushIntervalInSeconds;
      CmpArmLazyWriter(0, (unsigned __int64 *)&v22, 0);
    }
    return 1;
  }
  v19 = v13 - v14;
  if( (unsigned __int8)HvpSetRangeProtection((_HHIVE *)a1, v14 << 9, (v19 + 1) << 9, 4ui64) )
  {
    v20 = *(_DWORD *)(a1 + 104);
    *(_DWORD *)(a1 + 104) = v20 + v16;
    RtlSetBits((RTL_BITMAP *)(a1 + 88), v14, v19 + 1);
    CmpLogDirtyVectorUse((_CMHIVE *)a1, DirtyVectorModified, v4, v3);
    v21 = a1;
    if( !v20 )
    {
      *(_QWORD *)(a1 + 4176) = KiQueryUnbiasedInterruptTime(1u);
      CmpIssueNewDirtyCallback();
    }
    if( (int)(v16 + _InterlockedExchangeAdd(&CmpDirtySectorCount, v16)) >= 0x8000 )
      CmpForceFlushForCoalescing();
    goto LABEL_14;
  }
  return 0;
}

Referenced by:

CmpTransMgrSyncHive
HvCheckAndUpdateHiveBackupTimeStamp
HvFoldBackDirtyData
HvMarkDirty
HvpAddBin
HvpEnlistFreeCells
HvpMarkCellDirty
HvpRemapAndEnlistHiveBins