KeRundownQueueEx

_LIST_ENTRY *__stdcall KeRundownQueueEx(_KQUEUE *Queue, UINT8 Disassociate){
  UINT8 CurrentIrql; 
  _LIST_ENTRY *p_EntryListHead; 
  _KQUEUE *Flink; 
  _LIST_ENTRY *Blink; 
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  KiAcquireKobjectLockSafe(Queue);
  p_EntryListHead = &Queue->EntryListHead;
  Flink = (_KQUEUE *)Queue->EntryListHead.Flink;
  if( Flink == (_KQUEUE *)&Queue->EntryListHead )
  {
    Flink = 0i64;
  }
  else
  {
    Queue->Header.SignalState = 0;
    Blink = Queue->EntryListHead.Blink;
    if( Flink->Header.WaitListHead.Flink != p_EntryListHead || Blink->Flink != p_EntryListHead )
      __fastfail(3u);
    Blink->Flink = (_LIST_ENTRY *)Flink;
    Flink->Header.WaitListHead.Flink = Blink;
    Queue->EntryListHead.Blink = &Queue->EntryListHead;
    p_EntryListHead->Flink = p_EntryListHead;
  }
  KeRundownQueueCommon((INT64)Queue, &Queue->ThreadListHead, &Queue->CurrentCount, 1ui64, Disassociate);
  _InterlockedAnd(&Queue->Header.Lock, 0xFFFFFF7F);
  if( Disassociate )
    KiAcquireReleaseObjectRundownLockExclusive(Queue);
  KiExitDispatcher(KeGetCurrentPrcb(), 0i64, AdjustUnwait, 0i64, CurrentIrql);
  return(_LIST_ENTRY *)Flink;
}

Referenced by:

EtwpDeleteRegistrationObject
IopDeleteIoCompletionInternal
KeRundownQueue
KeUnInitializeUmsThread