EtwpStopLoggerInstance

NTSTATUS __stdcall EtwpStopLoggerInstance(_WMI_LOGGER_CONTEXT *LoggerContext){
  _ETW_SILODRIVERSTATE *SiloState; 
  unsigned int Flags; 
  unsigned int v4; 
  _ETHREAD *CurrentThread; 
  __int64 v6; 
  unsigned int v7; 
  PERIODIC_CAPTURE_STATE_CONTEXT *PeriodicCaptureStateContext; 
  INT64 Timer; 

  SiloState = LoggerContext->SiloState;
  _InterlockedOr((volatile signed __int32 *)&LoggerContext->832, 0x40u);
  if( (LoggerContext->LoggerMode & 0x2000000) != 0 )
    EtwpUpdateLoggerGroupMasks((_KTRAP_FRAME *)LoggerContext, 0i64);
  Flags = LoggerContext->Flags;
  if( (Flags & 0x20) == 0 )
  {
    EtwpDisableTraceProviders(SiloState, LoggerContext->LoggerId);
    Flags = LoggerContext->Flags;
  }
  if( (Flags & 0x4000) != 0 )
  {
    v4 = 0;
    while( SiloState->EtwpSecurityLoggers[v4] != LoggerContext->LoggerId )
    {
      if( ++v4 >= 8 )
        goto LABEL_11;
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(&SiloState->EtwpSecurityProviderGuidEntry.Lock, 0i64);
    SiloState->EtwpSecurityProviderEnableMask &= ~(1 << v4);
    v6 = v4;
    *(_OWORD *)&SiloState->EtwpSecurityProviderGuidEntry.EnableInfo[v6].IsEnabled = 0i64;
    *(_OWORD *)&SiloState->EtwpSecurityProviderGuidEntry.EnableInfo[v6].MatchAnyKeyword = 0i64;
    SiloState->EtwpSecurityLoggers[v4] = 0;
    SiloState->EtwpSecurityProviderGuidEntry.LockOwner = 0i64;
    ExReleasePushLockEx((_DWORD)SiloState + 432, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
LABEL_11:
  if( (LoggerContext->LoggerMode & 0x400) == 0 )
  {
    v7 = LoggerContext->Flags;
    if( (v7 & 0x800) != 0 )
    {
      EtwpLogPmcCounterRundown(LoggerContext, LoggerContext->LoggerId);
      v7 = LoggerContext->Flags;
    }
    if( (v7 & 0x1000000) != 0 )
      EtwpStackRundown((_SLIST_HEADER *)LoggerContext->StackCache, (UINT64)SiloState);
  }
  if( !_InterlockedExchange(&LoggerContext->CollectionOn, 0) )
    return -2147483611;
  PeriodicCaptureStateContext = LoggerContext->PeriodicCaptureStateContext;
  if( PeriodicCaptureStateContext )
  {
    Timer = (INT64)PeriodicCaptureStateContext->Timer;
    if( Timer )
      ExCancelTimer(Timer);
  }
  SiloState->EtwpLoggerContext[LoggerContext->LoggerId] = (_WMI_LOGGER_CONTEXT *)((unsigned __int64)LoggerContext | 1);
  if( ObGetCurrentIrql() > 2u )
  {
    if( !_interlockedbittestandset((volatile signed __int32 *)&LoggerContext->836, 8u) )
      KeInsertQueueDpc((UINT64)&LoggerContext->LoggerDpc, 0i64, 0i64);
  }
  else
  {
    KeSetEvent((PRKEVENT)&LoggerContext->gap1D4[28], 0, 0);
  }
  EtwpSendSessionNotification(LoggerContext, 2, 0i64);
  return 0;
}

Referenced by:

EtwpLogger
EtwpStartLogger
EtwpStopTrace