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