KeRundownQueueCommon

VOID __fastcall KeRundownQueueCommon(INT64 a1, _QWORD **a2, _DWORD *a3, UINT64 a4, CHAR a5){
  __int64 v5; 
  _QWORD *v9; 
  __int64 v10; 
  _KPRCB *CurrentPrcb; 
  _KWAIT_BLOCK *v12; 
  _KWAIT_BLOCK *Flink; 
  _KWAIT_BLOCK *v14; 
  unsigned __int8 WaitType; 
  _KQUEUE *NotificationQueue; 
  _LIST_ENTRY *p_WaitListHead; 
  struct _KPRCB *v18; 
  __int64 v19; 
  int SignalState; 
  _LIST_ENTRY *Blink; 
  __int64 v22; 
  _QWORD *v23; 
  INT64 v24; 
  INT64 WaitKey; 
  UINT64 SpinCount; 
  _interlockedbittestandset((volatile signed __int32 *)a1, 8u);
  v5 = (unsigned int)a4;
  if( a5 )
  {
    while( 1 )
    {
      v9 = *a2;
      if( *a2 == a2 )
        break;
      v22 = *v9;
      v23 = (_QWORD *)v9[1];
      if( *(_QWORD **)(*v9 + 8i64) != v9 || (_QWORD *)*v23 != v9 )
LABEL_26:
        __fastfail(3u);
      *v23 = v22;
      v24 = (INT64)(v9 - 65);
      *(_QWORD *)(v22 + 8) = v23;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v24 + 64), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v24 + 64) );
      }
      *(_QWORD *)(v24 + 232) = 0i64;
      KiReleaseThreadLockSafe(v24);
    }
    if( (_DWORD)v5 )
    {
      v10 = v5;
      do
      {
        *a3++ = 0;
        --v10;
      }
      while( v10 );
    }
  }
  CurrentPrcb = KeGetCurrentPrcb();
  v12 = (_KWAIT_BLOCK *)(a1 + 8);
  Flink = *(_KWAIT_BLOCK **)(a1 + 8);
  while( Flink != v12 )
  {
    v14 = Flink;
    Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
    WaitType = v14->WaitType;
    if( WaitType == 1 )
    {
      WaitKey = v14->WaitKey;
      goto LABEL_31;
    }
    if( WaitType == 2 )
    {
      v14->BlockState = 5;
      NotificationQueue = v14->NotificationQueue;
      v14->WaitListEntry.Flink = 0i64;
      p_WaitListHead = &NotificationQueue->Header.WaitListHead;
      KeGetCurrentIrql();
      __writecr8(2ui64);
      v18 = KeGetCurrentPrcb();
      v19 = *((_QWORD *)v18 + 1);
      KiAcquireKobjectLockSafe(NotificationQueue);
      if( p_WaitListHead->Flink == p_WaitListHead
        || NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
        || *(_KQUEUE **)(v19 + 232) == NotificationQueue && *(_BYTE *)(v19 + 643) == 15
        || !KiWakeQueueWaiter(v18, NotificationQueue, (INT64)v14) )
      {
        SignalState = NotificationQueue->Header.SignalState;
        NotificationQueue->Header.SignalState = SignalState + 1;
        Blink = NotificationQueue->EntryListHead.Blink;
        if( Blink->Flink != &NotificationQueue->EntryListHead )
          goto LABEL_26;
        v14->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
        v14->WaitListEntry.Blink = Blink;
        Blink->Flink = &v14->WaitListEntry;
        NotificationQueue->EntryListHead.Blink = &v14->WaitListEntry;
        if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
          KiWakeOtherQueueWaiters(v18, NotificationQueue);
      }
      _InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
    }
    else
    {
      WaitKey = 256i64;
LABEL_31:
      KiTryUnwaitThread(CurrentPrcb, v14, WaitKey, 0i64);
    }
  }
  v12->WaitListEntry.Blink = &v12->WaitListEntry;
  v12->WaitListEntry.Flink = &v12->WaitListEntry;
}

Referenced by:

KeRundownPriQueue
KeRundownQueueEx