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