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; 
  _DISPATCHER_HEADER *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 = (_DISPATCHER_HEADER *)QueueHeader->WaitListHead.Blink;
  while( Blink != (_DISPATCHER_HEADER *)&QueueHeader->WaitListHead && v4 < v5 )
  {
    v11 = (_KWAIT_BLOCK *)Blink;
    Blink = (_DISPATCHER_HEADER *)Blink->WaitListHead.Flink;
    if( v11->WaitType == 3 )
    {
      if( LowPart - *((_DWORD *)v11->Thread + 109) < (unsigned int)v8 )
        break;
      Flink = v11->WaitListEntry.Flink;
      if( (_KWAIT_BLOCK *)v11->WaitListEntry.Flink->Blink != v11 || *(_KWAIT_BLOCK **)&Blink->Lock != v11 )
        __fastfail(3u);
      *(_QWORD *)&Blink->Lock = Flink;
      Flink->Blink = (_LIST_ENTRY *)Blink;
      if( KiTryUnwaitThread(KeGetCurrentPrcb(), v11, 258i64, 0i64) )
        ++v4;
    }
  }
  _InterlockedAnd(&QueueHeader->Lock, 0xFFFFFF7F);
  KiExitDispatcher(KeGetCurrentPrcb(), 0i64, AdjustUnwait, 0i64, OldIrql);
  return v4;
}

Referenced by:

ExpWorkQueueManagerThread
ExpWorkerFactoryManagerThread