CmpGetNextActiveHive

_CMHIVE *__stdcall CmpGetNextActiveHive(_CMHIVE *OldHive){
  _CMHIVE *v1; 
  __int64 *v3; 
  v1 = 0i64;
  v3 = &CmpHiveListHead;
  if( OldHive )
    v3 = (__int64 *)((char *)OldHive + 1600);
  ExAcquirePushLockSharedEx((UINT64)&CmpHiveListHeadLock, 0i64);
  while( 1 )
  {
    v3 = (__int64 *)*v3;
    if( v3 == &CmpHiveListHead )
      break;
    v1 = (_CMHIVE *)(v3 - 200);
    if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)v3 + 4) )
      break;
    v1 = 0i64;
  }
  ExReleasePushLockEx((UINT64)&CmpHiveListHeadLock, 0i64);
  if( OldHive )
    ExReleaseRundownProtection((PEX_RUNDOWN_REF)OldHive + 204);
  return v1;
}

Referenced by:

CmEtwRunDown
CmFreezeRegistry
CmShutdownSystem
CmThawRegistry
CmpBlockTwoHiveWrites
CmpDoFlushNextHive
CmpDoLocalizeNextHive
CmpDoReconcileNextHive
CmpFreeAllMemory
CmpHandlePageFileOpenNotification
CmpIsHiveAlreadyLoaded
CmpLockKcbStackFlusherLocksExclusive
CmpTransMgrCommit
CmpTransMgrPrepare
CmpUpdatePhaseAccessBit