KeRundownQueueEx
_LIST_ENTRY *__stdcall KeRundownQueueEx(_KQUEUE *Queue, UINT8 Disassociate){
UINT8 OldIrql;
_QWORD *v5;
__int64 v6;
_QWORD *v8;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiAcquireKobjectLockSafe(Queue);
v5 = (_QWORD *)((char *)Queue + 24);
v6 = *((_QWORD *)Queue + 3);
if( (_KQUEUE *)v6 == (_KQUEUE *)((char *)Queue + 24) )
{
v6 = 0i64;
}
else
{
*((_DWORD *)Queue + 1) = 0;
v8 = (_QWORD *)*((_QWORD *)Queue + 4);
if( *(_QWORD **)(v6 + 8) != v5 || (_QWORD *)*v8 != v5 )
__fastfail(3u);
*v8 = v6;
*(_QWORD *)(v6 + 8) = v8;
*((_QWORD *)Queue + 4) = (char *)Queue + 24;
*v5 = v5;
}
KeRundownQueueCommon((__int64)Queue, (_QWORD **)Queue + 6, (_DWORD *)Queue + 10, 1u, Disassociate);
_InterlockedAnd((volatile signed __int32 *)Queue, 0xFFFFFF7F);
if( Disassociate )
KiAcquireReleaseObjectRundownLockExclusive(Queue);
KiExitDispatcher(KeGetCurrentPrcb(), 0i64, AdjustUnwait, 0i64, OldIrql);
return(_LIST_ENTRY *)v6;
}Referenced by:
EtwpDeleteRegistrationObject
IopDeleteIoCompletionInternal
KeRundownQueue
KeUnInitializeUmsThread