KiActivateWaiterPriQueue
VOID __stdcall KiActivateWaiterPriQueue(_KPRIQUEUE *Queue, _ETHREAD *Thread){
_LIST_ENTRY *v3;
_LIST_ENTRY *v4;
_LIST_ENTRY *v5;
_LIST_ENTRY *Flink;
INT64 WorkPriority;
HIDWORD(WorkPriority) = HIDWORD(Thread);
LODWORD(WorkPriority) = 0;
if( Queue->Header.WaitListHead.Flink != &Queue->Header.WaitListHead )
{
if( Queue->Header.SignalState )
{
v3 = KiAttemptFastRemovePriQueue(Queue, &WorkPriority, 0xFFFFFFFFi64);
v4 = v3;
if( v3 )
{
if( !KiWakePriQueueWaiter(KeGetCurrentPrcb(), Queue, (INT64)v3, (unsigned int)WorkPriority) )
{
++Queue->Header.SignalState;
v5 = &Queue->EntryListHead[(int)WorkPriority];
Flink = v5->Flink;
if( v5->Flink->Blink != v5 )
__fastfail(3u);
v4->Flink = Flink;
v4->Blink = v5;
Flink->Blink = v4;
v5->Flink = v4;
}
}
}
}
_InterlockedAnd(&Queue->Header.Lock, 0xFFFFFF7F);
}Referenced by:
KiActivateWaiterQueueWithNoLocks
KiCommitThreadWait
KiPriQueueThreadPriorityChanged