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