CmpGetNextHive

_CMHIVE *__stdcall CmpGetNextHive(_CMHIVE *OldHive){
  _CMHIVE *v1; 
  _LIST_ENTRY *p_HiveList; 
  __int64 *Flink; 
  __int64 **v5; 

  v1 = 0i64;
  p_HiveList = (_LIST_ENTRY *)&CmpHiveListHead;
  if( OldHive )
    p_HiveList = &OldHive->HiveList;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 340, 0i64);
  Flink = (__int64 *)p_HiveList->Flink;
  while( Flink != &CmpHiveListHead )
  {
    v1 = (_CMHIVE *)(Flink - 200);
    if( CmpReferenceHive((__int64)(Flink - 200)) )
      break;
    Flink = *v5;
    v1 = 0i64;
  }
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2720, 0);
  if( OldHive && _InterlockedExchangeAdd(&OldHive->ReferenceCount, 0xFFFFFFFF) == 1 )
    CmpDeleteHive(OldHive);
  return v1;
}

Referenced by:

CmLoadAppKey
CmpBlockHiveWrites
CmpDoFlushAll
CmpUnblockHiveWrites