CmpGetNextHive

__int64 *__fastcall CmpGetNextHive(volatile signed __int32 *P){
  __int64 *v1; 
  __int64 **v3; 
  __int64 *v4; 
  __int64 **v5; 
  v1 = 0i64;
  v3 = (__int64 **)&CmpHiveListHead;
  if( P )
    v3 = (__int64 **)(P + 400);
  ExAcquirePushLockSharedEx((UINT64)&CmpHiveListHeadLock, 0i64);
  v4 = *v3;
  while( v4 != &CmpHiveListHead )
  {
    v1 = v4 - 200;
    if( CmpReferenceHive((_CMHIVE *)(v4 - 200)) )
      break;
    v4 = *v5;
    v1 = 0i64;
  }
  ExReleasePushLockEx((UINT64)&CmpHiveListHeadLock, 0i64);
  if( P && _InterlockedExchangeAdd(P + 1068, 0xFFFFFFFF) == 1 )
    CmpDeleteHive((PVOID)P);
  return v1;
}

Referenced by:

CmLoadAppKey
CmpBlockHiveWrites
CmpDoFlushAll
CmpUnblockHiveWrites