CmpUnblockTwoHiveWrites
VOID __stdcall CmpUnblockTwoHiveWrites(_CMHIVE *Hive1, _CMHIVE *Hive2){
_CMSI_RW_LOCK *p_FlusherLock;
char v5;
if( Hive1 )
{
p_FlusherLock = &Hive1->Hive.FlusherLock;
v5 = _InterlockedExchangeAdd64((volatile signed __int64 *)&Hive1->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64);
if( (v5 & 2) != 0 && (v5 & 4) == 0 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive1->Hive.FlusherLock);
KeAbPostRelease(p_FlusherLock);
}
if( Hive2 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive2->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive2->Hive.FlusherLock);
KeAbPostRelease(&Hive2->Hive.FlusherLock);
}
if( Hive1 && _InterlockedExchangeAdd(&Hive1->ReferenceCount, 0xFFFFFFFF) == 1 )
CmpDeleteHive(Hive1);
if( Hive2 )
{
if( _InterlockedExchangeAdd(&Hive2->ReferenceCount, 0xFFFFFFFF) == 1 )
CmpDeleteHive(Hive2);
}
}Referenced by:
CmpVirtualBranchIsReplicated
CmpVirtualPathPresent