HvpFinishPrimaryWrite
VOID __fastcall HvpFinishPrimaryWrite(INT64 a1, INT64 a2, INT64 a3, UNICODE_STRING *a4){
char v4;
int v5;
int v6;
char v7;
v4 = 0;
v5 = *(_DWORD *)(a1 + 160) & 0x100;
v6 = (unsigned __int8)a3;
v7 = a2;
if( ((_BYTE)a2 == (v5 != 0) || ((*(_DWORD *)(a1 + 4264) >> 1) & 1) != (unsigned __int8)a3) && !(_BYTE)a4 )
{
CmpLockRegistry();
ExAcquirePushLockExclusiveEx(a1 + 72, 0i64);
v4 = 1;
}
if( v7 )
{
if( v5 )
*(_DWORD *)(a1 + 160) &= ~0x100u;
}
else if( !v5 )
{
CmpLogEvent((INT64)®_EVENT_FLUSH_IO_FAIL);
*(_DWORD *)(a1 + 160) |= 0x100u;
}
if( ((*(_DWORD *)(a1 + 4264) >> 1) & 1) != v6 )
*(_DWORD *)(a1 + 4264) ^= ((unsigned __int8)*(_DWORD *)(a1 + 4264) ^ (unsigned __int8)(2 * v6)) & 2;
if( v4 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 72), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 72));
KeAbPostRelease((PVOID)(a1 + 72));
CmpUnlockRegistry();
}
}Referenced by:
HvWriteHivePrimaryFile