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