KeInsertQueue
NTSTATUS __stdcall KeInsertQueue(PRKQUEUE Queue, PLIST_ENTRY Entry){
_LIST_ENTRY *p_WaitListHead;
UINT8 OldIrql;
struct _KPRCB *CurrentPrcb;
__int64 v7;
int v8;
_LIST_ENTRY *Blink;
int SignalState;
p_WaitListHead = &Queue->Header.WaitListHead;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v7 = *((_QWORD *)CurrentPrcb + 1);
KiAcquireKobjectLockSafe(Queue);
SignalState = Queue->Header.SignalState;
if( p_WaitListHead->Flink == p_WaitListHead
|| Queue->CurrentCount >= Queue->MaximumCount
|| *(PRKQUEUE *)(v7 + 232) == Queue && *(_BYTE *)(v7 + 643) == 15
|| !KiWakeQueueWaiter(CurrentPrcb, Queue, (INT64)Entry) )
{
v8 = Queue->Header.SignalState;
Queue->Header.SignalState = v8 + 1;
Blink = Queue->EntryListHead.Blink;
if( Blink->Flink != &Queue->EntryListHead )
__fastfail(3u);
Entry->Flink = &Queue->EntryListHead;
Entry->Blink = Blink;
Blink->Flink = Entry;
Queue->EntryListHead.Blink = Entry;
if( !v8 && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(CurrentPrcb, Queue);
}
_InterlockedAnd(&Queue->Header.Lock, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
return SignalState;
}Referenced by:
EtwpQueueReply
FsRtlpPostStackOverflow
IopPassiveInterruptDpc
KeSynchronizeUmsThread
KiSwapToUmsThreadContinue