CmpBlockTwoHiveWrites

NTSTATUS __stdcall CmpBlockTwoHiveWrites(_CMHIVE *Hive1, _CMHIVE *Hive2, UINT8 Reference){
  char v3; 
  char v4; 
  _CMHIVE *i; 
  _CMHIVE *NextActiveHive; 
  _CMHIVE *v10; 
  _CMHIVE *v12; 

  v3 = 0;
  v4 = 0;
  for( i = 0i64; ; i = v10 )
  {
    NextActiveHive = CmpGetNextActiveHive(i);
    v10 = NextActiveHive;
    if( !NextActiveHive )
      break;
    if( Hive1 == NextActiveHive || Hive2 == NextActiveHive )
    {
      if( Reference )
        CmpReferenceHive((__int64)NextActiveHive);
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&v10->Hive.FlusherLock, 0i64);
      if( Hive1 == v10 )
        v3 = 1;
      else
        v4 = 1;
      if( (!Hive1 || v3 == 1) && (!Hive2 || v4 == 1) )
      {
        ExReleaseRundownProtection(&v10->HiveRundown);
        break;
      }
    }
  }
  if( (!Hive1 || v3) && (!Hive2 || v4) )
    return 0;
  if( v3 == 1 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive1->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive1->Hive.FlusherLock);
    KeAbPostRelease(&Hive1->Hive.FlusherLock);
    if( !Reference || _InterlockedExchangeAdd(&Hive1->ReferenceCount, 0xFFFFFFFF) != 1 )
      return -1073741772;
    v12 = Hive1;
  }
  else
  {
    if( v4 != 1 )
      return -1073741772;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Hive2->Hive.FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)&Hive2->Hive.FlusherLock);
    KeAbPostRelease(&Hive2->Hive.FlusherLock);
    if( !Reference || _InterlockedExchangeAdd(&Hive2->ReferenceCount, 0xFFFFFFFF) != 1 )
      return -1073741772;
    v12 = Hive2;
  }
  CmpDeleteHive(v12);
  return -1073741772;
}

Referenced by:

CmSaveMergedKeys
CmpVirtualBranchIsReplicated
CmpVirtualPathPresent