EtwDeleteSiloState

VOID __stdcall EtwDeleteSiloState(_ETW_SILODRIVERSTATE *SiloState){
  unsigned int MaxLoggers; 
  int v3; 
  unsigned int i; 
  _ETHREAD *CurrentThread; 
  _ETW_HASH_BUCKET *v6; 
  signed int j; 
  unsigned int k; 
  _EX_RUNDOWN_REF_CACHE_AWARE *v9; 
  char *PartitionName; 

  if( !SiloState )
    goto LABEL_19;
  MaxLoggers = SiloState->MaxLoggers;
  v3 = 0;
  if( MaxLoggers )
  {
    while( SiloState->EtwpLoggerContext[v3] == (_WMI_LOGGER_CONTEXT *)1 )
    {
      if( ++v3 >= MaxLoggers )
        goto LABEL_5;
    }
LABEL_19:
    KeBugCheck(0x11Du);
  }
LABEL_5:
  for( i = 0; i < 0x40; ++i )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v6 = &SiloState->EtwpGuidHashTable[i];
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx(&v6->BucketLock, 0i64);
    for( j = 0; (unsigned int)j < 3; ++j )
    {
      if( v6->ListHead[j].Flink != &v6->ListHead[j] )
        goto LABEL_19;
    }
    if( _InterlockedCompareExchange64(&v6->BucketLock._bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(&v6->BucketLock);
    KeAbPostRelease(&v6->BucketLock);
    KeLeaveCriticalRegion();
  }
  for( k = 0; k < SiloState->MaxLoggers; ++k )
  {
    v9 = SiloState->EtwpLoggerRundown[k];
    if( v9 )
      ExFreeCacheAwareRundownProtection((ULONG_PTR)v9);
  }
  ExFreePoolWithTag(SiloState->ProcessorBlocks, 0x61777445u);
  ExFreePoolWithTag(SiloState->EtwpLoggerRundown, 0x61777445u);
  PartitionName = SiloState->PartitionName;
  if( PartitionName )
    ExFreePoolWithTag(PartitionName, 0x61777445u);
  ExFreePoolWithTag(SiloState, 0x61777445u);
}

Referenced by:

PspDeleteServerSiloGlobals