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