EtwpUnreferenceGuidEntry

INT64 __fastcall EtwpUnreferenceGuidEntry(PVOID P){
  INT64 v2; 
  _ETHREAD *CurrentThread; 
  int v5; 
  int v6; 
  int v7; 
  int v8; 
  __int64 v9; 
  volatile INT64 *v10; 
  _QWORD *v11; 
  PVOID *v12; 
  v2 = _InterlockedDecrement64((volatile signed __int64 *)P + 4);
  if( v2 )
  {
    if( v2 < 0 )
      KeBugCheckEx(0x11Du, 9ui64, (ULONG_PTR)P, 0i64, 0i64);
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v5 = *((_DWORD *)P + 10);
    v6 = *((_DWORD *)P + 13);
    v7 = *((_DWORD *)P + 12);
    v8 = *((_DWORD *)P + 11);
    v9 = *((_QWORD *)P + 49);
    --*((_WORD *)CurrentThread + 242);
    v10 = (volatile INT64 *)(56i64 * (((unsigned __int8)v8 ^ (unsigned __int8)(v7 ^ v6 ^ v5)) & 0x3F) + v9 + 512);
    ExAcquirePushLockExclusiveEx((UINT64)v10, 0i64);
    v11 = *(_QWORD **)P;
    if( *(PVOID *)(*(_QWORD *)P + 8i64) != P || (v12 = (PVOID *)*((_QWORD *)P + 1), *v12 != P) )
      __fastfail(3u);
    *v12 = v11;
    v11[1] = v12;
    if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v10);
    KeAbPostRelease((PVOID)v10);
    KeLeaveCriticalRegion();
    EtwpFreeGuidEntry((_ETW_GUID_ENTRY *)P);
  }
  return v2;
}

Referenced by:

EtwGetProviderIdFromHandle
EtwUnregister
EtwpAddGuidEntry
EtwpAddRegEntryToGroup
EtwpClearSessionAndUnreferenceEntry
EtwpDeleteRegistrationObject
EtwpDisallowedGuidAddition
EtwpDisallowedGuidRemoval
EtwpEnableGuid
EtwpFreeGuidEntry
EtwpGetNextGuidEntry
EtwpGetTraceGroupInfo
EtwpGetTraceGuidInfo
EtwpNotifyGuid
EtwpRegisterProvider
EtwpRegisterUMGuid
EtwpUpdateGuidEnableInfo
NtTraceEvent
SendCaptureStateNotificationsWorker