EtwpAddGuidEntry

_ETW_GUID_ENTRY *__stdcall EtwpAddGuidEntry(_ETW_SILODRIVERSTATE *SiloState, _GUID *Guid, _ETW_GUID_TYPE GuidType){
  __int64 v3; 
  _ETW_GUID_ENTRY *GuidEntryByGuid; 
  _ETW_GUID_ENTRY *v7; 
  _ETW_HASH_BUCKET *v9; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *p_SiloGuidList; 
  _LIST_ENTRY *v12; 
  _LIST_ENTRY *Flink; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *p_BucketLock; 
  _ETW_GUID_ENTRY *i; 
  _LIST_ENTRY *v17; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v19; 

  v3 = GuidType;
  GuidEntryByGuid = 0i64;
  v7 = EtwpAllocGuidEntry((_GUID *)SiloState);
  if( !v7 )
    return 0i64;
  if( SiloState != (_ETW_SILODRIVERSTATE *)EtwpHostSiloState )
  {
    GuidEntryByGuid = EtwpFindGuidEntryByGuid((_ETW_SILODRIVERSTATE *)EtwpHostSiloState, Guid, (_ETW_GUID_TYPE)v3);
    if( !GuidEntryByGuid )
    {
      GuidEntryByGuid = EtwpAddGuidEntry((_ETW_SILODRIVERSTATE *)EtwpHostSiloState, Guid, (_ETW_GUID_TYPE)v3);
      if( !GuidEntryByGuid )
      {
        --v7->RefCount;
        EtwpFreeGuidEntry(v7);
        return 0i64;
      }
    }
  }
  v9 = &SiloState->EtwpGuidHashTable[((unsigned __int8)Guid->Data1 ^ (unsigned __int8)(*(_DWORD *)&Guid->Data2 ^ *(_DWORD *)Guid->Data4 ^ *(_DWORD *)&Guid->Data4[4])) & 0x3F];
  v10 = &v9->ListHead[v3];
  if( GuidEntryByGuid )
  {
    KeEnterCriticalRegion();
    ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
    p_SiloGuidList = &GuidEntryByGuid->SiloGuidList;
    GuidEntryByGuid->LockOwner = (_ETHREAD *)KeGetCurrentThread();
    v12 = &v7->SiloGuidList;
    v7->HostEntry = GuidEntryByGuid;
    Flink = GuidEntryByGuid->SiloGuidList.Flink;
    if( Flink->Blink != &GuidEntryByGuid->SiloGuidList )
      goto LABEL_33;
    v12->Flink = Flink;
    v7->SiloGuidList.Blink = p_SiloGuidList;
    Flink->Blink = v12;
    p_SiloGuidList->Flink = v12;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  p_BucketLock = &v9->BucketLock;
  ExAcquirePushLockExclusiveEx(&v9->BucketLock, 0i64);
  for( i = (_ETW_GUID_ENTRY *)v10->Flink; ; i = (_ETW_GUID_ENTRY *)i->GuidList.Flink )
  {
    if( i == (_ETW_GUID_ENTRY *)v10 )
      goto LABEL_23;
    if( *(_QWORD *)&Guid->Data1 == *(_QWORD *)&i->Guid.Data1
      && *(_QWORD *)Guid->Data4 == *(_QWORD *)i->Guid.Data4
      && EtwpReferenceGuidEntry(i) )
    {
      break;
    }
  }
  if( i )
  {
    if( (_InterlockedExchangeAdd64(&p_BucketLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(p_BucketLock);
    KeAbPostRelease(p_BucketLock);
    KeLeaveCriticalRegion();
    if( !GuidEntryByGuid )
      goto LABEL_30;
    v17 = v7->SiloGuidList.Flink;
    if( v17->Blink == &v7->SiloGuidList )
    {
      Blink = v7->SiloGuidList.Blink;
      if( Blink->Flink == &v7->SiloGuidList )
      {
        Blink->Flink = v17;
        v17->Blink = Blink;
        v7->HostEntry = 0i64;
        goto LABEL_27;
      }
    }
LABEL_33:
    __fastfail(3u);
  }
LABEL_23:
  v19 = v10->Flink;
  if( v10->Flink->Blink != v10 )
    goto LABEL_33;
  v7->GuidList.Flink = v19;
  i = v7;
  v7->GuidList.Blink = v10;
  v19->Blink = &v7->GuidList;
  v10->Flink = &v7->GuidList;
  v7 = 0i64;
  if( (_InterlockedExchangeAdd64(&p_BucketLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(p_BucketLock);
  KeAbPostRelease(p_BucketLock);
  KeLeaveCriticalRegion();
LABEL_27:
  if( !GuidEntryByGuid )
    goto LABEL_30;
  GuidEntryByGuid->LockOwner = 0i64;
  ExReleasePushLockEx((_DWORD)GuidEntryByGuid + 408, 0);
  KeLeaveCriticalRegion();
  if( v7 )
  {
    EtwpUnreferenceGuidEntry(GuidEntryByGuid);
LABEL_30:
    if( v7 )
    {
      --v7->RefCount;
      EtwpFreeGuidEntry(v7);
    }
  }
  return i;
}

Referenced by:

EtwpAddGuidEntry
EtwpAddRegEntryToGroup
EtwpEnableGuid
EtwpRegisterProvider
EtwpRegisterUMGuid