KeInsertPriQueue
UINT8 __stdcall KeInsertPriQueue(_KPRIQUEUE *Queue, _LIST_ENTRY *Entry, INT64 Priority, INT64 Increment, UINT64 Flags){
__int64 v5;
_LIST_ENTRY *p_WaitListHead;
UINT8 v8;
UINT8 OldIrql;
struct _KPRCB *CurrentPrcb;
__int64 v11;
unsigned int v12;
unsigned int *p_MaximumCount;
__int64 v14;
int v15;
unsigned int MaximumCount;
_LIST_ENTRY *v17;
unsigned int v18;
_LIST_ENTRY *v20;
_LIST_ENTRY *Blink;
v5 = (int)Priority;
p_WaitListHead = &Queue->Header.WaitListHead;
v8 = 0;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v11 = *((_QWORD *)CurrentPrcb + 1);
KiAcquireKobjectLockSafe(Queue);
if( p_WaitListHead->Flink != p_WaitListHead && (*(_KPRIQUEUE **)(v11 + 232) != Queue || *(_BYTE *)(v11 + 643) != 15) )
{
v12 = 0;
p_MaximumCount = &Queue->MaximumCount;
v14 = 32i64;
while( 1 )
{
v15 = *--p_MaximumCount;
v12 += v15;
--v14;
MaximumCount = Queue->MaximumCount;
if( v12 >= MaximumCount )
break;
if( v14 <= v5 )
{
if( v12 >= MaximumCount )
break;
v17 = Entry;
v8 = KiWakePriQueueWaiter(CurrentPrcb, Queue, (INT64)Entry, (unsigned int)v5);
if( !v8 )
goto LABEL_13;
goto LABEL_8;
}
}
}
v17 = Entry;
LABEL_13:
if( (Flags & 2) == 0 )
{
++Queue->Header.SignalState;
v20 = &Queue->EntryListHead[v5];
Blink = v20->Blink;
if( Blink->Flink != v20 )
__fastfail(3u);
v17->Flink = v20;
v17->Blink = Blink;
Blink->Flink = v17;
v20->Blink = v17;
}
LABEL_8:
_InterlockedAnd(&Queue->Header.Lock, 0xFFFFFF7F);
if( (Flags & 1) != 0 )
v18 = 3;
else
v18 = 0;
KiExitDispatcher(CurrentPrcb, v18, AdjustUnwait, 0i64, OldIrql);
return v8;
}Referenced by:
ExpTryQueueWorkItem