HvpMarkDirty

UINT8 __stdcall HvpMarkDirty(ULONG_PTR Hive, UINT64 Start, UINT64 Length, _CM_HIVE_DIRTY_REASON Reason){
  unsigned int v4; 
  unsigned int v5; 
  __int64 v6; 
  int v7; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  int v11; 
  int v12; 
  int v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v20; 
  int v21; 
  __int64 v22; 
  __int64 EligibleTime[2]; 

  v4 = Length;
  v5 = Start;
  v6 = *(_QWORD *)&Hive;
  if( (*(_DWORD *)(*(_QWORD *)&Hive + 160i64) & 1) != 0 || (Start & 0x80000000) != 0i64 )
    return 1;
  v7 = Start - 1;
  v8 = Start;
  v9 = *(_DWORD *)(v6 + 136);
  v10 = (unsigned int)(Length + v7) >> 9;
  v11 = v8 >> 9;
  if( v9 <= 1 )
  {
    v13 = v11;
  }
  else
  {
    v12 = ~(v9 - 1);
    v13 = v11 & v12;
    v10 = (v12 & (v9 + v10)) - 1;
  }
  v14 = ((v10 + 16) & 0xFFFFFFF8) - 9;
  v15 = (v13 + 8) & 0xFFFFFFF8;
  if( v15 )
    v15 -= 8;
  v16 = *(_DWORD *)(v6 + 272) >> 9;
  if( v14 >= v16 )
    v14 = v16 - 1;
  v17 = 0;
  v18 = v15;
  if( v15 > v14 )
    goto LABEL_14;
  do
  {
    if( !_bittest64(*(const signed __int64 **)(v6 + 96), v18) )
      ++v17;
    ++v18;
  }
  while( v18 <= v14 );
  if( !v17 )
  {
LABEL_14:
    if( (*(_DWORD *)(v6 + 160) & 2) == 0 )
    {
      EligibleTime[0] = *(_QWORD *)(v6 + 4176) + 10000000i64 * (unsigned int)CmpLazyFlushIntervalInSeconds;
      CmpArmLazyWriter(CmpLazyFlusher, (UINT64 *)EligibleTime, 0i64);
    }
    return 1;
  }
  v20 = v14 - v15;
  if( HvpSetRangeProtection(v6, v15 << 9, (v20 + 1) << 9, 4ui64) )
  {
    v21 = *(_DWORD *)(v6 + 104);
    *(_DWORD *)(v6 + 104) = v21 + v17;
    RtlSetBits((_RTL_BITMAP *)(v6 + 88), v15, v20 + 1);
    CmpLogDirtyVectorUse((_CMHIVE *)v6, DirtyVectorModified, v5, v4);
    v22 = v6;
    if( !v21 )
    {
      *(_QWORD *)(v6 + 4176) = KiQueryUnbiasedInterruptTime(1u);
      CmpIssueNewDirtyCallback();
    }
    if( (int)(v17 + _InterlockedExchangeAdd(&CmpDirtySectorCount, v17)) >= 0x8000 )
      CmpForceFlushForCoalescing();
    goto LABEL_14;
  }
  return 0;
}

Referenced by:

CmpTransMgrSyncHive
HvCheckAndUpdateHiveBackupTimeStamp
HvFoldBackDirtyData
HvMarkDirty
HvpAddBin
HvpEnlistFreeCells
HvpMarkCellDirty
HvpRemapAndEnlistHiveBins