KeInsertHeadQueue
VOID __stdcall KeInsertHeadQueue(_KQUEUE *Queue, _LIST_ENTRY *Entry){
_LIST_ENTRY *p_WaitListHead;
UINT8 OldIrql;
struct _KPRCB *CurrentPrcb;
__int64 v7;
int SignalState;
_LIST_ENTRY *p_EntryListHead;
_LIST_ENTRY *Flink;
p_WaitListHead = &Queue->Header.WaitListHead;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v7 = *((_QWORD *)CurrentPrcb + 1);
KiAcquireKobjectLockSafe(Queue);
if( p_WaitListHead->Flink == p_WaitListHead
|| Queue->CurrentCount >= Queue->MaximumCount
|| *(_KQUEUE **)(v7 + 232) == Queue && *(_BYTE *)(v7 + 643) == 15
|| !KiWakeQueueWaiter(CurrentPrcb, Queue, (INT64)Entry) )
{
SignalState = Queue->Header.SignalState;
Queue->Header.SignalState = SignalState + 1;
p_EntryListHead = &Queue->EntryListHead;
Flink = Queue->EntryListHead.Flink;
if( Flink->Blink != &Queue->EntryListHead )
__fastfail(3u);
Entry->Flink = Flink;
Entry->Blink = p_EntryListHead;
Flink->Blink = Entry;
p_EntryListHead->Flink = Entry;
if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(CurrentPrcb, Queue);
}
_InterlockedAnd(&Queue->Header.Lock, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}Referenced by:
No references.