HvpFinishPrimaryWrite
VOID __stdcall HvpFinishPrimaryWrite(_HHIVE *Hive, UINT8 Success, UINT8 DiskFileBad, UINT8 LocksHeld){
char v4;
unsigned int v5;
int v6;
v4 = 0;
v5 = Hive->HiveFlags & 0x100;
v6 = DiskFileBad;
if( (Success == (v5 != 0) || ((LODWORD(Hive[2].Storage[1].FreeDisplay[10].Display.Buffer) >> 1) & 1) != DiskFileBad)
&& !LocksHeld )
{
CmpLockRegistry();
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&Hive->FlusherLock, 0i64);
v4 = 1;
}
if( Success )
{
if( v5 )
Hive->HiveFlags &= ~0x100u;
}
else if( !v5 )
{
CmpLogEvent(
(_EVENT_DESCRIPTOR *)®_EVENT_FLUSH_IO_FAIL,
3221225805i64,
(_UNICODE_STRING *)&Hive[1].Storage[0].Guard,
(_UNICODE_STRING *)LocksHeld);
Hive->HiveFlags |= 0x100u;
}
if( ((LODWORD(Hive[2].Storage[1].FreeDisplay[10].Display.Buffer) >> 1) & 1) != v6 )
LODWORD(Hive[2].Storage[1].FreeDisplay[10].Display.Buffer) ^= ((unsigned __int8)LODWORD(Hive[2].Storage[1].FreeDisplay[10].Display.Buffer) ^ (unsigned __int8)(2 * v6)) & 2;
if( v4 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive->FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive->FlusherLock);
KeAbPostRelease(&Hive->FlusherLock);
CmpUnlockRegistry();
}
}Referenced by:
HvWriteHivePrimaryFile