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.