EtwpFreeGuidEntry

VOID __stdcall EtwpFreeGuidEntry(_ETW_GUID_ENTRY *GuidEntry){
  _ETW_FILTER_HEADER *FilterData; 
  _ETHREAD *CurrentThread; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 

  if( GuidEntry->HostEntry )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(&GuidEntry->HostEntry->Lock, 0i64);
    GuidEntry->HostEntry->LockOwner = (_ETHREAD *)KeGetCurrentThread();
    Flink = GuidEntry->SiloGuidList.Flink;
    if( Flink->Blink != &GuidEntry->SiloGuidList
      || (Blink = GuidEntry->SiloGuidList.Blink, Blink->Flink != &GuidEntry->SiloGuidList) )
    {
      __fastfail(3u);
    }
    Blink->Flink = Flink;
    Flink->Blink = Blink;
    GuidEntry->HostEntry->LockOwner = 0i64;
    ExReleasePushLockEx((ULONG_PTR)&GuidEntry->HostEntry->Lock, 0);
    KeLeaveCriticalRegion();
    EtwpUnreferenceGuidEntry(GuidEntry->HostEntry);
  }
  ObDereferenceSecurityDescriptor(GuidEntry->SecurityDescriptor, 1ui64);
  FilterData = GuidEntry->FilterData;
  if( FilterData )
    ExFreePoolWithTag(FilterData, 0);
  _InterlockedAdd(&GuidEntry->SiloState->EtwpCounters.GuidCount, 0xFFFFFFFF);
  ExFreePoolWithTag(GuidEntry, 0);
}

Referenced by:

EtwpAddGuidEntry
EtwpUnreferenceGuidEntry