private CancellationTokenSource CreateEntryListenerThread()
        {
            m_entryListenerPoller = NtCore.CreateEntryListenerPoller(Handle);
            CancellationTokenSource source = new CancellationTokenSource();
            var ret = new Thread(() =>
            {
                bool wasInterrupted = false;
                var token           = source.Token;
                token.Register(() =>
                {
                    NtCore.CancelPollEntryListener(m_entryListenerPoller);
                });
                while (!token.IsCancellationRequested)
                {
                    var events = NtCore.PollEntryListener(m_entryListenerPoller);
                    if (token.IsCancellationRequested)
                    {
                        NtCore.DisposeEntryListenerSpan(events);
                        break;
                    }
                    if (events.Length == 0)
                    {
                        NtCore.DisposeEntryListenerSpan(events);
                        lock (m_entryListenerWaitQueueLock)
                        {
                            if (m_entryListenerWaitQueue)
                            {
                                m_entryListenerWaitQueue = false;
                                Monitor.PulseAll(m_entryListenerWaitQueueLock);
                                continue;
                            }
                        }
                        wasInterrupted = true;
                        break;
                    }
                    for (int i = 0; i < events.Length; i++)
                    {
                        EntryNotificationDelegate?listener;
                        lock (m_entryListenerLock)
                        {
                            m_entryListeners.TryGetValue(events.Pointer[i].listener, out listener);
                        }
                        if (listener != null)
                        {
                            listener(new RefEntryNotification(this, events.Pointer[i]));
                            if (token.IsCancellationRequested)
                            {
                                break;
                            }
                        }
                    }
                    NtCore.DisposeEntryListenerSpan(events);
                }
                lock (m_entryListenerWaitQueueLock)
                {
                    if (!wasInterrupted)
                    {
                        NtCore.DestroyEntryListenerPoller(m_entryListenerPoller);
                    }
                    m_entryListenerPoller = new NtEntryListenerPoller();
                }
            })
            {
                Name         = "NTEntryListener",
                IsBackground = true
            };

            ret.Start();
            m_entryListenerThread = ret;
            return(source);
        }