EtwpGetTraceGroupInfo

INT64 __fastcall EtwpGetTraceGroupInfo(
        _ETW_SILODRIVERSTATE *SiloState,
        _GUID *Provider,
        VOID *Buffer,
        UINT64 *OutBufferLen){
  unsigned int v4; 
  unsigned int v6; 
  unsigned int v7; 
  int v8; 
  _ETW_GUID_ENTRY *GuidEntryByGuid; 
  _ETHREAD *CurrentThread; 
  __int64 v12; 
  __int64 v13; 
  _OWORD *v14; 
  _TRACE_ENABLE_INFO *EnableInfo; 
  _LIST_ENTRY *Flink; 
  UINT64 v17; 
  char *v18; 
  _ETHREAD *v19; 
  char *v20; 
  __int64 v21; 
  char *v22; 
  int *v23; 
  UINT64 pulResult; 
  UINT64 *v25; 
  v25 = OutBufferLen;
  v4 = *(_DWORD *)OutBufferLen;
  v6 = 0;
  v7 = 0;
  v8 = 0;
  GuidEntryByGuid = EtwpFindGuidEntryByGuid(SiloState, Provider, EtwGroupGuidType);
  if( !GuidEntryByGuid )
    return 3221226133i64;
  memset((INT64)Buffer, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&GuidEntryByGuid->Lock, 0i64);
  LODWORD(v12) = 4;
  GuidEntryByGuid->LockOwner = (_ETHREAD *)KeGetCurrentThread();
  v13 = 8i64;
  if( v4 >= 4 )
    *(_DWORD *)Buffer = 8;
  v14 = (char *)Buffer + 4;
  EnableInfo = GuidEntryByGuid->EnableInfo;
  do
  {
    v12 = (unsigned int)(v12 + 32);
    if( (unsigned int)v12 <= v4 )
    {
      *v14 = *(_OWORD *)&EnableInfo->IsEnabled;
      v14[1] = *(_OWORD *)&EnableInfo->MatchAnyKeyword;
      v14 += 2;
    }
    ++EnableInfo;
    --v13;
  }
  while( v13 );
  Flink = GuidEntryByGuid->RegListHead.Flink;
  v23 = (int *)((char *)Buffer + v12);
  v17 = (unsigned int)(v12 + 4);
  v18 = (char *)Buffer + (unsigned int)v17;
  LODWORD(pulResult) = v17;
  v22 = v18;
  while( Flink != &GuidEntryByGuid->RegListHead )
  {
    if( RtlULongAdd(v17, 0x10ui64, &pulResult) < 0 )
    {
      v6 = -2147483643;
      goto LABEL_29;
    }
    v17 = (unsigned int)pulResult;
    ++v7;
    if( (unsigned int)pulResult <= v4 )
    {
      v19 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v19 + 242);
      ExAcquirePushLockExclusiveEx((UINT64)&Flink[1].Flink[25].Blink, 0i64);
      Flink[1].Flink[26].Flink = (_LIST_ENTRY *)KeGetCurrentThread();
      *(_OWORD *)v22 = *(_OWORD *)&Flink[1].Flink[2].Blink;
      Flink[1].Flink[26].Flink = 0i64;
      ExReleasePushLockEx((UINT64)&Flink[1].Flink[25].Blink, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      v22 += 16;
      v17 = (unsigned int)pulResult;
    }
    Flink = Flink->Flink;
  }
  if( (unsigned int)v17 > v4 )
  {
    v6 = -1073741789;
  }
  else
  {
    if( v7 == 1 )
    {
      v8 = 1;
    }
    else if( v7 > 1 )
    {
      qsort((WCHAR *)v18, v7, (const WCHAR *)0x10, EtwpCompareGuid);
      v20 = v18 + 16;
      v8 = 1;
      v21 = v7 - 1;
      do
      {
        if( *(_QWORD *)v20 != *(_QWORD *)v18 || *((_QWORD *)v20 + 1) != *((_QWORD *)v18 + 1) )
        {
          v18 += 16;
          if( v18 != v20 )
            *(_OWORD *)v18 = *(_OWORD *)v20;
          ++v8;
        }
        v20 += 16;
        --v21;
      }
      while( v21 );
    }
    *v23 = v8;
  }
LABEL_29:
  GuidEntryByGuid->LockOwner = 0i64;
  ExReleasePushLockEx((UINT64)&GuidEntryByGuid->Lock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  EtwpUnreferenceGuidEntry(GuidEntryByGuid);
  *(_DWORD *)v25 = pulResult;
  return v6;
}

Referenced by:

NtTraceControl