EtwpApplyEventNameFilter

INT64 __fastcall EtwpApplyEventNameFilter(
        _ETW_GUID_ENTRY *GuidEntry,
        INT64 LoggerIndex,
        INT64 UserDataCount,
        _EVENT_DATA_DESCRIPTOR *UserData,
        INT64 UserMode,
        INT64 CurrentIrql,
        INT64 Level,
        UINT64 Keyword){
  INT64 result; 
  __int64 v9; 
  void **v11; 
  unsigned __int8 v12; 
  unsigned int v13; 
  _EVENT_DATA_DESCRIPTOR *v14; 
  unsigned int v15; 
  char *v16; 
  unsigned __int64 v17; 
  signed __int64 v18; 
  void *v19; 
  void *v20; 
  _ETW_FILTER_HEADER *FilterData; 
  __int64 v22; 
  _ETW_FILTER_EVENT_NAME_DATA *v23; 
  _ETW_FILTER_EVENT_NAME_DATA *StackWalkNameFilter; 
  _ETW_FILTER_HEADER *v25; 
  unsigned __int8 v26; 
  unsigned __int64 MatchAllKeyword; 
  bool v28; 
  bool v29; 
  char v30; 
  UINT16 NameLength; 
  PVOID P; 
  unsigned int v33; 
  void **v34; 
  void *Src[2]; 
  char v36; 
  v9 = (unsigned int)LoggerIndex;
  NameLength = 0;
  P = 0i64;
  *(_OWORD *)Src = 0i64;
  v11 = 0i64;
  v34 = 0i64;
  v12 = 0;
  v30 = 0;
  v29 = 1;
  if( (_BYTE)UserMode )
  {
    result = 16i64 * (unsigned int)UserDataCount;
    if( result )
    {
      if( ((unsigned __int8)UserData & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)UserData + result > 0x7FFFFFFF0000i64
        || (_EVENT_DATA_DESCRIPTOR *)((char *)UserData + result) < UserData )
      {
        result = 0i64;
        MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
  }
  v13 = 0;
  v33 = 0;
  while( v13 < (unsigned int)UserDataCount )
  {
    v14 = &UserData[v13];
    if( v14->Type == 1 )
    {
      if( (unsigned __int8)CurrentIrql >= 2u )
      {
        v11 = (void **)&UserData[v13];
        v34 = v11;
        result = v14->Ptr;
        P = (PVOID)v14->Ptr;
      }
      else
      {
        *(_EVENT_DATA_DESCRIPTOR *)Src = *v14;
        v11 = Src;
        v34 = Src;
        v15 = _mm_cvtsi128_si32(_mm_srli_si128(*(__m128i *)Src, 8));
        if( v15 >= 0xFFFF )
        {
          v29 = 0;
          goto LABEL_61;
        }
        if( (_BYTE)UserMode )
        {
          if( v15 )
          {
            v16 = (char *)Src[0] + v15;
            if( (unsigned __int64)v16 > 0x7FFFFFFF0000i64 || v16 < Src[0] )
            {
              MEMORY[0x7FFFFFFF0000] = 0;
              v15 = (unsigned int)Src[1];
            }
          }
        }
        if( v15 <= 0x100 )
        {
          v17 = v15 + 15i64;
          if( v17 <= v15 )
            v17 = 0xFFFFFFFFFFFFFF0i64;
          v18 = v17 & 0xFFFFFFFFFFFFFFF0ui64;
          v19 = alloca(v18);
          v20 = alloca(v18);
          P = &v29;
        }
        else
        {
          result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, v15, 0x74777445ui64);
          P = (PVOID)result;
          if( !result )
          {
            v29 = 1;
            goto LABEL_61;
          }
          v30 = 1;
          v15 = (unsigned int)Src[1];
        }
        memmove((UINT8 *)P, (UINT8 *)Src[0], v15);
      }
      break;
    }
    v33 = ++v13;
  }
  if( !v11 || !P )
    goto LABEL_54;
  if( (unsigned __int8)CurrentIrql < 2u )
  {
    v12 = KeGetCurrentIrql();
    __writecr8(2ui64);
    result = (unsigned int)KiIrqlFlags;
  }
  FilterData = GuidEntry->FilterData;
  if( FilterData )
  {
    v22 = v9;
    v23 = v36 ? FilterData[v22].StackWalkNameFilter : FilterData[v22].EventNameFilter;
    if( v23 )
    {
      StackWalkNameFilter = 0i64;
      v25 = GuidEntry->FilterData;
      if( v25 )
      {
        if( v36 )
        {
          result = v25[v9].FilterFlags & 0x80002000;
          if( (_DWORD)result == -2147475456 )
            StackWalkNameFilter = v25[v22].StackWalkNameFilter;
        }
        else
        {
          result = v25[v9].FilterFlags & 0x80000400;
          if( (_DWORD)result == -2147482624 )
            StackWalkNameFilter = v25[v22].EventNameFilter;
        }
        if( StackWalkNameFilter )
        {
          v26 = StackWalkNameFilter->Level;
          if( (unsigned __int8)Level <= v26 || !v26 )
          {
            if( !Keyword
              || (Keyword & StackWalkNameFilter->MatchAnyKeyword) != 0
              && (MatchAllKeyword = StackWalkNameFilter->MatchAllKeyword,
                  result = Keyword & MatchAllKeyword,
                  (Keyword & MatchAllKeyword) == MatchAllKeyword) )
            {
              result = (INT64)EtwpGetEventNameFromEventMetadata((PSTR)P, *((unsigned int *)v34 + 2), &NameLength);
              if( !result )
              {
                if( (unsigned __int8)CurrentIrql < 2u )
                {
                  result = v12;
                  __writecr8(v12);
                }
LABEL_54:
                v29 = 1;
                goto LABEL_61;
              }
              if( NameLength )
                v28 = v23->FilterIn == (unsigned __int8)EtwpEventNameFilterSearch(
                                                          (const char *)result,
                                                          NameLength,
                                                          (__int64)v23);
              else
                v28 = v23->FilterIn == 0;
              v29 = v28;
            }
          }
        }
      }
    }
  }
  if( (unsigned __int8)CurrentIrql < 2u )
  {
    result = v12;
    __writecr8(v12);
  }
LABEL_61:
  if( v30 )
    ExFreePoolWithTag(P, 0);
  LOBYTE(result) = v29;
  return result;
}

Referenced by:

EtwpEventWriteFull
EtwpWriteUserEvent