KeRundownQueueCommon
void __fastcall KeRundownQueueCommon(__int64 a1, _QWORD **a2, _DWORD *a3, unsigned int a4, char a5){
__int64 v5;
_QWORD *v9;
__int64 v10;
_KPRCB *CurrentPrcb;
_KWAIT_BLOCK *v12;
_KWAIT_BLOCK *Flink;
_KWAIT_BLOCK *v14;
unsigned __int8 WaitType;
_ETHREAD *Thread;
_QWORD *v17;
struct _KPRCB *v18;
_ETHREAD *CurrentThread;
int v20;
_KWAIT_BLOCK **QuantumTarget;
__int64 v22;
_QWORD *v23;
INT64 v24;
char v25;
INT64 WaitKey;
UINT64 SpinCount;
_interlockedbittestandset((volatile signed __int32 *)a1, 8u);
v5 = 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;
Thread = v14->Thread;
v14->WaitListEntry.Flink = 0i64;
v17 = &Thread->Tcb.gap0[8];
KeGetCurrentIrql();
__writecr8(2ui64);
v18 = KeGetCurrentPrcb();
CurrentThread = v18->CurrentThread;
KiAcquireKobjectLockSafe(Thread);
if( (_QWORD *)*v17 == v17
|| LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
|| (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
|| (KiWakeQueueWaiter(v18, (_KQUEUE *)Thread, (INT64)v14), !v25) )
{
v20 = *(_DWORD *)&Thread->Tcb.gap0[4];
*(_DWORD *)&Thread->Tcb.gap0[4] = v20 + 1;
QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
goto LABEL_26;
v14->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
v14->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
*QuantumTarget = v14;
Thread->Tcb.QuantumTarget = (unsigned __int64)v14;
if( !v20 && (_QWORD *)*v17 != v17 )
KiWakeOtherQueueWaiters(v18, (_KQUEUE *)Thread);
}
_InterlockedAnd((volatile signed __int32 *)Thread, 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