CmpArmLazyWriter
void __fastcall CmpArmLazyWriter(int a1, unsigned __int64 *a2, char a3){
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
__int64 v7;
unsigned __int8 v8;
unsigned __int64 v9;
unsigned __int64 v10;
int v11;
unsigned __int64 v12;
ULONG v13;
__int64 v14;
if( CmpWorkerDataInitialized && !CmpHoldLazyFlush )
{
v4 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - KUSER_SHARED_DATA.InterruptTimeBias;
if( a2 )
{
v5 = v4 + 10000000i64 * HIDWORD(CmpLazyWriterData[24 * a1 + 22]);
v6 = *a2;
if( *a2 >= v5 )
v6 = v5;
}
else if( a3 )
{
v6 = v4 + 20000000;
}
else
{
v6 = 10000000i64 * HIDWORD(CmpLazyWriterData[24 * a1 + 22]) + v4;
}
v7 = 24i64 * a1;
KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpLazyWriterData[v7 + 19], a1);
v9 = v8;
v10 = CmpLazyWriterData[v7 + 21] & 7;
if( v10 > 3 )
goto LABEL_9;
if( (_DWORD)v10 == 1 )
{
if( a3 && KeCancelTimer((PKTIMER)&CmpLazyWriterData[v7]) )
goto LABEL_23;
}
else
{
if( !(_DWORD)v10 )
{
LABEL_23:
v12 = 1i64;
LABEL_16:
CmpLazyWriterData[v7 + 21] = v12;
if( v12 == 1 )
{
if( a3 )
{
v14 = -20000000i64;
v13 = 1000;
}
else
{
v13 = CmpLazyWriterData[v7 + 23];
v14 = -10000000i64 * SHIDWORD(CmpLazyWriterData[v7 + 22]);
}
KeSetCoalescableTimer(
(PKTIMER)&CmpLazyWriterData[v7],
(LARGE_INTEGER)v14,
0,
v13,
(PKDPC)&CmpLazyWriterData[v7 + 8]);
}
goto LABEL_9;
}
v11 = v10 - 2;
if( !v11 || v11 == 1 && v6 < (CmpLazyWriterData[v7 + 21] & 0xFFFFFFFFFFFFFFF8ui64) )
{
v12 = v6 & 0xFFFFFFFFFFFFFFF8ui64 | 3;
goto LABEL_16;
}
}
LABEL_9:
KxReleaseSpinLock((UINT64 *)&CmpLazyWriterData[v7 + 19]);
__writecr8(v9);
}
}Referenced by:
CmpEnableLazyFlush
CmpFlushHive
CmpRecheckHiveVolumePolicy
HvMarkBaseBlockDirty
HvpMarkDirty