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