EtwpClearSessionAndUnreferenceEntry

NTSTATUS __stdcall EtwpClearSessionAndUnreferenceEntry(UINT64 LoggerId, _ETW_GUID_ENTRY *GuidEntry, UINT8 GuidType){
  UINT8 v3; 
  _ETHREAD *CurrentThread; 
  int v6; 
  NTSTATUS v7; 
  UINT64 v8; 
  _TRACE_ENABLE_INFO *v9; 
  unsigned __int8 *p_Level; 
  __int64 v12; 
  unsigned __int8 v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  int v17; 
  unsigned __int8 v18; 
  unsigned __int8 v19; 
  __int128 v20; 
  _ETW_GUID_ENTRY *Flink; 
  _ETWP_NOTIFICATION_HEADER *v22; 
  _ETW_GUID_ENTRY *v23; 
  unsigned __int8 *v24; 
  unsigned __int8 v25; 
  unsigned __int8 v26; 
  int SchematizedFilterSize; 
  int v28; 
  unsigned int v29; 
  NTSTATUS v30; 
  volatile __int64 RefCount; 
  _ETHREAD *v32; 
  char v33; 
  char v34; 
  _ETWP_NOTIFICATION_HEADER *DataBlock; 
  int v37; 
  __int64 v38; 
  int v39; 
  int v40; 
  __int128 v41; 
  __int128 v42; 
  _TRACE_ENABLE_INFO EnableInfo; 

  v40 = LoggerId;
  memset(&EnableInfo, 0, sizeof(EnableInfo));
  v3 = GuidType;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = LoggerId;
  v33 = 0;
  DataBlock = 0i64;
  v7 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&GuidEntry->Lock, 0i64);
  GuidEntry->LockOwner = (_ETHREAD *)KeGetCurrentThread();
  v39 = GuidEntry->LastEnable.LoggerId;
  if( v39 == v6 )
    GuidEntry->80 = 0i64;
  v8 = 0i64;
  v9 = GuidEntry->EnableInfo;
  while( v9->IsEnabled != 1 || v9->LoggerId != v6 )
  {
    v8 = (unsigned int)(v8 + 1);
    ++v9;
    if( (unsigned int)v8 >= 8 )
    {
      v34 = 0;
      goto LABEL_7;
    }
  }
  v9->IsEnabled = 0;
  p_Level = &GuidEntry->EnableInfo[0].Level;
  v12 = 0i64;
  v41 = 0ui64;
  v13 = 0;
  *(_QWORD *)&v42 = 0i64;
  v14 = -1i64;
  v15 = 1 << v8;
  v16 = 8i64;
  *((_QWORD *)&v42 + 1) = -1i64;
  v17 = 0;
  do
  {
    if( *((_DWORD *)p_Level - 1) )
    {
      v18 = *p_Level;
      v19 = v13;
      LODWORD(v41) = 1;
      if( v13 <= v18 )
        v19 = v18;
      v12 |= *(_QWORD *)(p_Level + 12);
      v14 &= *(_QWORD *)(p_Level + 20);
      v13 = v19;
      v17 |= *((_DWORD *)p_Level + 1);
    }
    p_Level += 32;
    --v16;
  }
  while( v16 );
  *(_QWORD *)&v42 = v12;
  BYTE4(v41) = v13;
  *((_QWORD *)&v42 + 1) = v14;
  v20 = v42;
  DWORD2(v41) = v17;
  *(_OWORD *)&GuidEntry->ProviderEnableInfo.IsEnabled = v41;
  *(_OWORD *)&GuidEntry->ProviderEnableInfo.MatchAnyKeyword = v20;
  EtwpUpdateFilterData(GuidEntry, v8, 0i64, 1u, 0i64);
  v34 = 1;
  Flink = (_ETW_GUID_ENTRY *)GuidEntry->RegListHead.Flink;
  if( Flink != (_ETW_GUID_ENTRY *)&GuidEntry->RegListHead )
  {
    v22 = DataBlock;
    LOBYTE(v15) = ~(_BYTE)v15;
    v37 = v15;
    do
    {
      if( v3 )
      {
        v32 = (_ETHREAD *)KeGetCurrentThread();
        v23 = (_ETW_GUID_ENTRY *)((char *)Flink - 16);
        v24 = (unsigned __int8 *)&Flink->MatchId + 5;
        --v32->Tcb.KernelApcDisable;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&Flink->SiloGuidList.Flink[25].Blink, 0i64);
        v22 = DataBlock;
        v33 = 1;
        Flink->SiloGuidList.Flink[26].Flink = (_LIST_ENTRY *)KeGetCurrentThread();
      }
      else
      {
        v23 = Flink;
        v24 = &Flink->ProviderEnableInfo.Level;
      }
      v25 = *v24;
      Flink = (_ETW_GUID_ENTRY *)Flink->GuidList.Flink;
      v26 = *v24 & v15;
      *v24 = v26;
      if( ((v23->ProviderEnableInfo.IsEnabled & 0x80000) == 0 || v39 == v40) && v26 != v25 )
      {
        EtwpComputeRegEntryEnableInfo((_ETW_REG_ENTRY *)v23, &EnableInfo);
        SchematizedFilterSize = EtwpGetSchematizedFilterSize(GuidEntry, v23->ProviderEnableInfo.Level);
        v28 = SchematizedFilterSize;
        v29 = 120;
        if( SchematizedFilterSize )
          v29 = SchematizedFilterSize + 136;
        if( v22 )
        {
          if( v22->NotificationSize != v29 || RtlCompareMemory(&v22->SourceGuid[1], &EnableInfo, 32) != (_SIZE_T *)32 )
          {
            EtwpUnreferenceDataBlock(v22);
            v22 = 0i64;
            DataBlock = 0i64;
          }
          if( v22 )
            goto LABEL_29;
        }
        v30 = EtwpAllocDataBlock(v29, 0i64, &DataBlock);
        v22 = DataBlock;
        v7 = v30;
        if( v30 >= 0 )
        {
          DataBlock->NotificationType = EtwNotificationTypeEnable;
          v22->NotificationSize = v29;
          RefCount = v23->RefCount;
          BYTE3(v38) = 0;
          v22->DestinationGuid = *(_GUID *)(RefCount + 40);
          *(_TRACE_ENABLE_INFO *)&v22->SourceGuid[1].Data1 = EnableInfo;
          *(_DWORD *)v22->SourceGuid[3].Data4 = GuidEntry->LastEnable._bf_b & 1;
          LOWORD(v38) = GuidEntry->LastEnable.LoggerId;
          BYTE2(v38) = GuidEntry->LastEnable.Level;
          HIDWORD(v38) = GuidEntry->LastEnable.EnableFlags.anonymous_0.LowPart;
          *(_QWORD *)&v22->SourceGuid[3].Data1 = v38;
          if( v28 )
          {
            *(_DWORD *)&v22->SourceGuid[4].Data4[4] = 0x80000000;
            *(_DWORD *)v22->SourceGuid[4].Data4 = v28;
            *(_QWORD *)&v22->SourceGuid[4].Data1 = 136i64;
            EtwpCopySchematizedFilters(&v22->SourceGuid[5], (__int64)GuidEntry, v23->ProviderEnableInfo.Level);
            *(_DWORD *)&v22->SourceGuid[3].Data4[4] = 1;
          }
          else
          {
            *(_DWORD *)&v22->SourceGuid[3].Data4[4] = 0;
          }
        }
        if( v22 )
LABEL_29:
          v7 = EtwpSendDataBlock((_ETW_REG_ENTRY *)v23, v22);
        LOBYTE(v15) = v37;
      }
      if( v33 )
      {
        *(_QWORD *)(v23->RefCount + 416) = 0i64;
        ExReleasePushLockEx(v23->RefCount + 408, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        v22 = DataBlock;
        v33 = 0;
      }
      v3 = GuidType;
    }
    while( Flink != (_ETW_GUID_ENTRY *)&GuidEntry->RegListHead );
    if( v22 )
      EtwpUnreferenceDataBlock(v22);
  }
LABEL_7:
  GuidEntry->LockOwner = 0i64;
  ExReleasePushLockEx((_DWORD)GuidEntry + 408, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v34 == 1 )
    EtwpUnreferenceGuidEntry(GuidEntry);
  return v7;
}

Referenced by:

EtwpDisableTraceProviders