KeTimeOutQueueWaiters

UINT64 __stdcall KeTimeOutQueueWaiters(_DISPATCHER_HEADER *QueueHeader, UINT64 Timeout, UINT64 MaxRemovalCount){
  unsigned int v4; 
  unsigned int v5; 
  unsigned int LowPart; 
  volatile CCHAR v7; 
  unsigned __int64 v8; 
  UINT8 OldIrql; 
  _KWAIT_BLOCK *Blink; 
  _KWAIT_BLOCK *v11; 
  _LIST_ENTRY *Flink; 

  v4 = 0;
  v5 = MaxRemovalCount;
  LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
  v7 = KeNumberProcessorsGroup0[2];
  v8 = (unsigned __int64)((Timeout * (unsigned __int128)(unsigned __int64)KiMaximumIncrementReciprocal) >> 64) >> v7;
  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  KiAcquireKobjectLockSafe(QueueHeader);
  Blink = (_KWAIT_BLOCK *)*((_QWORD *)QueueHeader + 2);
  while( Blink != (_KWAIT_BLOCK *)((char *)QueueHeader + 8) && v4 < v5 )
  {
    v11 = Blink;
    Blink = (_KWAIT_BLOCK *)Blink->WaitListEntry.Blink;
    if( v11->WaitType == 3 )
    {
      if( LowPart - v11->Thread->Tcb.WaitBlock[2].SpareLong < (unsigned int)v8 )
        break;
      Flink = v11->WaitListEntry.Flink;
      if( (_KWAIT_BLOCK *)v11->WaitListEntry.Flink->Blink != v11 || (_KWAIT_BLOCK *)Blink->WaitListEntry.Flink != v11 )
        __fastfail(3u);
      Blink->WaitListEntry.Flink = Flink;
      Flink->Blink = &Blink->WaitListEntry;
      if( KiTryUnwaitThread(KeGetCurrentPrcb(), v11, 258i64, 0i64) )
        ++v4;
    }
  }
  _InterlockedAnd((volatile signed __int32 *)QueueHeader, 0xFFFFFF7F);
  KiExitDispatcher(KeGetCurrentPrcb(), 0i64, AdjustUnwait, 0i64, OldIrql);
  return v4;
}

Referenced by:

ExpWorkQueueManagerThread
ExpWorkerFactoryManagerThread