KeRundownQueueCommon
VOID __fastcall KeRundownQueueCommon(INT64 a1, _QWORD **a2, _DWORD *a3, UINT64 a4, CHAR a5){
__int64 v5;
_QWORD *v9;
__int64 v10;
_KPRCB *CurrentPrcb;
_KWAIT_BLOCK *v12;
_KWAIT_BLOCK *Flink;
_KWAIT_BLOCK *v14;
unsigned __int8 WaitType;
_KQUEUE *NotificationQueue;
_LIST_ENTRY *p_WaitListHead;
struct _KPRCB *v18;
__int64 v19;
int SignalState;
_LIST_ENTRY *Blink;
__int64 v22;
_QWORD *v23;
INT64 v24;
INT64 WaitKey;
UINT64 SpinCount;
_interlockedbittestandset((volatile signed __int32 *)a1, 8u);
v5 = (unsigned int)a4;
if( a5 )
{
while( 1 )
{
v9 = *a2;
if( *a2 == a2 )
break;
v22 = *v9;
v23 = (_QWORD *)v9[1];
if( *(_QWORD **)(*v9 + 8i64) != v9 || (_QWORD *)*v23 != v9 )
LABEL_26:
__fastfail(3u);
*v23 = v22;
v24 = (INT64)(v9 - 65);
*(_QWORD *)(v22 + 8) = v23;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v24 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v24 + 64) );
}
*(_QWORD *)(v24 + 232) = 0i64;
KiReleaseThreadLockSafe(v24);
}
if( (_DWORD)v5 )
{
v10 = v5;
do
{
*a3++ = 0;
--v10;
}
while( v10 );
}
}
CurrentPrcb = KeGetCurrentPrcb();
v12 = (_KWAIT_BLOCK *)(a1 + 8);
Flink = *(_KWAIT_BLOCK **)(a1 + 8);
while( Flink != v12 )
{
v14 = Flink;
Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
WaitType = v14->WaitType;
if( WaitType == 1 )
{
WaitKey = v14->WaitKey;
goto LABEL_31;
}
if( WaitType == 2 )
{
v14->BlockState = 5;
NotificationQueue = v14->NotificationQueue;
v14->WaitListEntry.Flink = 0i64;
p_WaitListHead = &NotificationQueue->Header.WaitListHead;
KeGetCurrentIrql();
__writecr8(2ui64);
v18 = KeGetCurrentPrcb();
v19 = *((_QWORD *)v18 + 1);
KiAcquireKobjectLockSafe(NotificationQueue);
if( p_WaitListHead->Flink == p_WaitListHead
|| NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
|| *(_KQUEUE **)(v19 + 232) == NotificationQueue && *(_BYTE *)(v19 + 643) == 15
|| !KiWakeQueueWaiter(v18, NotificationQueue, (INT64)v14) )
{
SignalState = NotificationQueue->Header.SignalState;
NotificationQueue->Header.SignalState = SignalState + 1;
Blink = NotificationQueue->EntryListHead.Blink;
if( Blink->Flink != &NotificationQueue->EntryListHead )
goto LABEL_26;
v14->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
v14->WaitListEntry.Blink = Blink;
Blink->Flink = &v14->WaitListEntry;
NotificationQueue->EntryListHead.Blink = &v14->WaitListEntry;
if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(v18, NotificationQueue);
}
_InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
}
else
{
WaitKey = 256i64;
LABEL_31:
KiTryUnwaitThread(CurrentPrcb, v14, WaitKey, 0i64);
}
}
v12->WaitListEntry.Blink = &v12->WaitListEntry;
v12->WaitListEntry.Flink = &v12->WaitListEntry;
}Referenced by:
KeRundownPriQueue
KeRundownQueueEx