EtwpEnableTrace

INT64 __fastcall EtwpEnableTrace(
        _ETW_SILODRIVERSTATE *SiloState,
        const _GUID *ProviderId,
        const _GUID *SourceId,
        UINT64 TraceHandle,
        UINT64 ControlCode,
        UINT8 Level,
        UINT64 OrKeywordMask,
        UINT64 AndKeywordMask,
        UINT64 EnableProperty,
        _UNICODE_STRING *ScopeFilters,
        _EVENT_FILTER_EVENT_ID **EventFilters){
  _UNICODE_STRING *v11; 
  __int16 v12; 
  int v14; 
  int v15; 
  unsigned int v16; 
  _UNICODE_STRING *v17; 
  int Length; 
  UINT8 **v19; 
  unsigned int v20; 
  _EVENT_FILTER_EVENT_ID **v21; 
  int v22; 
  int v23; 
  int v24; 
  int v25; 
  int v26; 
  int v27; 
  int v28; 
  int v29; 
  unsigned int v30; 
  char *PoolWithTag; 
  char *v32; 
  _GUID v33; 
  unsigned int v34; 
  unsigned int Count; 
  char *v37; 
  unsigned int v38; 
  __int64 v39; 
  unsigned int i; 
  unsigned int j; 
  __int64 v42; 
  int v43; 
  unsigned int v44; 
  __int64 v45; 
  __int64 v46; 
  UINT64 v47; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  UINT8 *Src; 
  unsigned int Size; 
  UINT8 *v57; 
  unsigned int v58; 
  UINT8 *v59; 
  unsigned int v60; 
  __int64 v61; 
  v11 = ScopeFilters;
  v12 = TraceHandle;
  v14 = 0;
  v15 = 120;
  if( ScopeFilters )
  {
    v16 = 0;
    v17 = ScopeFilters;
    do
    {
      Length = v17->Length;
      if( (_WORD)Length && v17->Buffer )
      {
        if( (unsigned __int16)Length > 0x400u )
          return(unsigned int)-1073741811;
        ++v14;
        v15 += Length + 2;
      }
      ++v16;
      ++v17;
    }
    while( v16 < 4 );
  }
  v19 = (UINT8 **)EventFilters;
  if( EventFilters )
  {
    v20 = 0;
    v21 = EventFilters;
    do
    {
      if( *v21 )
      {
        Count = (*v21)->Count;
        if( (_WORD)Count )
        {
          if( Count > 0x40 )
            return(unsigned int)-1073741811;
          ++v14;
          v15 += 2 * Count + 4;
        }
      }
      ++v20;
      ++v21;
    }
    while( v20 < 2 );
  }
  v22 = v14 + 1;
  if( !Size )
    v22 = v14;
  v23 = v15 + Size;
  if( !Size )
    v23 = v15;
  v24 = v22 + 1;
  if( !v58 )
    v24 = v22;
  v25 = v23 + v58;
  if( !v58 )
    v25 = v23;
  v26 = v24 + 1;
  if( !v60 )
    v26 = v24;
  v27 = v25 + v60;
  if( !v60 )
    v27 = v25;
  v28 = v26 + 1;
  if( !v61 )
    v28 = v26;
  v29 = v27 + 24;
  if( !v61 )
    v29 = v27;
  v30 = 16 * v28 + v29;
  PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v30, 0x74777445ui64);
  v32 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    *(_DWORD *)v32 = 3;
    *((_DWORD *)v32 + 1) = v30;
    if( SourceId )
      *(_GUID *)(v32 + 56) = *SourceId;
    v33 = *ProviderId;
    *((_DWORD *)v32 + 18) = ControlCode;
    v32[76] = Level;
    *((_QWORD *)v32 + 12) = AndKeywordMask;
    *((_QWORD *)v32 + 11) = OrKeywordMask;
    *((_DWORD *)v32 + 20) = EnableProperty;
    *((_WORD *)v32 + 39) = v12;
    *((_DWORD *)v32 + 29) = v28;
    *(_GUID *)(v32 + 40) = v33;
    if( v28 )
    {
      v37 = v32 + 120;
      v38 = 0;
      v39 = (__int64)&v32[16 * v28 + 120];
      for( i = 0; i < 4; ++i )
      {
        if( v11->Length && v11->Buffer )
        {
          if( i )
          {
            if( i == 1 )
            {
              *(_DWORD *)&v37[16 * v38 + 12] = -2147483632;
            }
            else if( i == 2 )
            {
              *(_DWORD *)&v37[16 * v38 + 12] = -2147483616;
            }
            else
            {
              *(_DWORD *)&v37[16 * v38 + 12] = -2147450880;
            }
          }
          else
          {
            *(_DWORD *)&v37[16 * v38 + 12] = -2147483640;
          }
          v46 = 2i64 * v38;
          v47 = (unsigned int)v11->Length + 2;
          *(_DWORD *)&v37[8 * v46 + 8] = v47;
          *(_QWORD *)&v37[8 * v46] = v39 - (_QWORD)v32;
          memmove((UINT8 *)v39, (UINT8 *)v11->Buffer, v47);
          v48 = *(unsigned int *)&v37[16 * v38++ + 8];
          v39 += v48;
        }
        ++v11;
      }
      for( j = 0; j < 2; ++j )
      {
        if( *v19 && *((_WORD *)*v19 + 1) )
        {
          if( j )
            *(_DWORD *)&v37[16 * v38 + 12] = -2147479552;
          else
            *(_DWORD *)&v37[16 * v38 + 12] = -2147483136;
          v42 = 2i64 * v38;
          v43 = *((unsigned __int16 *)*v19 + 1);
          *(_QWORD *)&v37[8 * v42] = v39 - (_QWORD)v32;
          v44 = 2 * v43 + 4;
          *(_DWORD *)&v37[8 * v42 + 8] = v44;
          memmove((UINT8 *)v39, *v19, v44);
          v45 = *(unsigned int *)&v37[16 * v38++ + 8];
          v39 += v45;
        }
        ++v19;
      }
      if( Size )
      {
        v49 = 2i64 * v38;
        *(_DWORD *)&v37[8 * v49 + 8] = Size;
        *(_DWORD *)&v37[8 * v49 + 12] = -2147482624;
        *(_QWORD *)&v37[8 * v49] = v39 - (_QWORD)v32;
        memmove((UINT8 *)v39, Src, Size);
        v39 += *(unsigned int *)&v37[16 * v38++ + 8];
      }
      if( v58 )
      {
        v50 = 2i64 * v38;
        *(_DWORD *)&v37[8 * v50 + 8] = v58;
        *(_DWORD *)&v37[8 * v50 + 12] = -2147475456;
        *(_QWORD *)&v37[8 * v50] = v39 - (_QWORD)v32;
        memmove((UINT8 *)v39, v57, v58);
        v39 += *(unsigned int *)&v37[16 * v38++ + 8];
      }
      if( v60 )
      {
        v51 = 2i64 * v38;
        *(_DWORD *)&v37[8 * v51 + 8] = v60;
        *(_DWORD *)&v37[8 * v51 + 12] = 0x80000000;
        *(_QWORD *)&v37[8 * v51] = v39 - (_QWORD)v32;
        memmove((UINT8 *)v39, v59, v60);
        v39 += *(unsigned int *)&v37[16 * v38++ + 8];
      }
      if( v61 )
      {
        v52 = 2i64 * v38;
        *(_DWORD *)&v37[8 * v52 + 12] = -2147467264;
        *(_DWORD *)&v37[8 * v52 + 8] = 24;
        *(_QWORD *)&v37[8 * v52] = v39 - (_QWORD)v32;
        *(_OWORD *)v39 = *(_OWORD *)v61;
        *(_QWORD *)(v39 + 16) = *(_QWORD *)(v61 + 16);
      }
    }
    v34 = EtwpEnableGuid((__int64)SiloState, (__int64)v32, 0);
    ExFreePoolWithTag(v32, 0);
  }
  else
  {
    return(unsigned int)-1073741801;
  }
  return v34;
}

Referenced by:

EtwEnableTrace
EtwpEnableAutoLoggerProvider