EtwpGetNextGuidEntry

volatile INT64 *__fastcall EtwpGetNextGuidEntry(INT64 a1, volatile INT64 *a2, INT64 a3){
  INT64 v3; 
  volatile INT64 *v4; 
  char v5; 
  volatile INT64 *v6; 
  INT64 v7; 
  _ETW_GUID_ENTRY **v8; 
  INT64 *v9; 
  __int64 i; 
  _ETHREAD *CurrentThread; 
  _ETW_GUID_ENTRY **v12; 
  _ETW_GUID_ENTRY *j; 
  v3 = a1 + 464;
  v4 = a2;
  v5 = 0;
  v6 = 0i64;
  if( a2 )
    v7 = v3
       + 56i64
       * (((unsigned __int8)*((_DWORD *)a2 + 10) ^ (unsigned __int8)(*((_DWORD *)a2 + 11) ^ *((_DWORD *)a2 + 12) ^ *((_DWORD *)a2 + 13))) & 0x3F);
  else
    v7 = a1 + 464;
  v8 = (_ETW_GUID_ENTRY **)(v7 + 16i64 * (int)a3);
  v9 = (INT64 *)(v7 + 48);
  for( i = 2 * ((int)a3 - 3i64); ; v8 = (_ETW_GUID_ENTRY **)&v9[i] )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockSharedEx((UINT64)v9, 0i64);
    v12 = v8;
    if( v4 )
      v12 = (_ETW_GUID_ENTRY **)v4;
    for( j = *v12; j != (_ETW_GUID_ENTRY *)v8; j = (_ETW_GUID_ENTRY *)j->GuidList.Flink )
    {
      v6 = (volatile INT64 *)j;
      if( EtwpReferenceGuidEntry(j) )
      {
        v5 = 1;
        break;
      }
    }
    if( _InterlockedCompareExchange64(v9, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v9);
    KeAbPostRelease(v9);
    KeLeaveCriticalRegion();
    if( v4 )
      EtwpUnreferenceGuidEntry((PVOID)v4);
    if( v5 )
      return v6;
    v9 += 7;
    if( v9 == (INT64 *)(v3 + 3632) )
      break;
    v4 = 0i64;
  }
  return 0i64;
}

Referenced by:

EtwpDisableTraceProviders
EtwpEnumerateTraceGuids
EtwpEventTracingCounterSetCallback
EtwpGetTraceGroupList
EtwpGetTraceGuidList
EtwpSetProviderBinaryTracking
EtwpTracingProvEnableCallback