KeRundownQueueCommon

void __fastcall KeRundownQueueCommon(__int64 a1, _QWORD **a2, _DWORD *a3, unsigned int a4, char a5){
  __int64 v5; 
  _QWORD *v9; 
  __int64 v10; 
  _KPRCB *CurrentPrcb; 
  _KWAIT_BLOCK *v12; 
  _KWAIT_BLOCK *Flink; 
  _KWAIT_BLOCK *v14; 
  unsigned __int8 WaitType; 
  _ETHREAD *Thread; 
  _QWORD *v17; 
  struct _KPRCB *v18; 
  _ETHREAD *CurrentThread; 
  int v20; 
  _KWAIT_BLOCK **QuantumTarget; 
  __int64 v22; 
  _QWORD *v23; 
  INT64 v24; 
  char v25; 
  INT64 WaitKey; 
  UINT64 SpinCount; 

  _interlockedbittestandset((volatile signed __int32 *)a1, 8u);
  v5 = 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;
      Thread = v14->Thread;
      v14->WaitListEntry.Flink = 0i64;
      v17 = &Thread->Tcb.gap0[8];
      KeGetCurrentIrql();
      __writecr8(2ui64);
      v18 = KeGetCurrentPrcb();
      CurrentThread = v18->CurrentThread;
      KiAcquireKobjectLockSafe(Thread);
      if( (_QWORD *)*v17 == v17
        || LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
        || (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
        || (KiWakeQueueWaiter(v18, (_KQUEUE *)Thread, (INT64)v14), !v25) )
      {
        v20 = *(_DWORD *)&Thread->Tcb.gap0[4];
        *(_DWORD *)&Thread->Tcb.gap0[4] = v20 + 1;
        QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
        if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
          goto LABEL_26;
        v14->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
        v14->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
        *QuantumTarget = v14;
        Thread->Tcb.QuantumTarget = (unsigned __int64)v14;
        if( !v20 && (_QWORD *)*v17 != v17 )
          KiWakeOtherQueueWaiters(v18, (_KQUEUE *)Thread);
      }
      _InterlockedAnd((volatile signed __int32 *)Thread, 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