KiWakeOtherQueueWaiters
VOID __stdcall KiWakeOtherQueueWaiters(_KPRCB *Prcb, _KQUEUE *Queue){
_KWAIT_BLOCK *Blink;
_KWAIT_BLOCK *v5;
unsigned __int8 WaitType;
_LIST_ENTRY *v7;
struct _KPRCB *CurrentPrcb;
INT64 WaitKey;
_ETHREAD *Thread;
_LIST_ENTRY *Flink;
_DWORD *SchedulerAssist;
UINT64 SpinCount;
Blink = (_KWAIT_BLOCK *)*((_QWORD *)Queue + 2);
do
{
v5 = Blink;
Blink = (_KWAIT_BLOCK *)Blink->WaitListEntry.Blink;
WaitType = v5->WaitType;
if( WaitType == 2 )
{
Flink = v5->WaitListEntry.Flink;
if( (_KWAIT_BLOCK *)v5->WaitListEntry.Flink->Blink != v5 || (_KWAIT_BLOCK *)Blink->WaitListEntry.Flink != v5 )
goto LABEL_19;
Blink->WaitListEntry.Flink = Flink;
Flink->Blink = &Blink->WaitListEntry;
v5->BlockState = 5;
KiInsertQueueInternal(v5->NotificationQueue, &v5->WaitListEntry);
}
else
{
if( WaitType != 1 )
return;
v7 = v5->WaitListEntry.Flink;
if( (_KWAIT_BLOCK *)v5->WaitListEntry.Flink->Blink != v5 || (_KWAIT_BLOCK *)Blink->WaitListEntry.Flink != v5 )
LABEL_19:
__fastfail(3u);
Blink->WaitListEntry.Flink = v7;
v7->Blink = &Blink->WaitListEntry;
CurrentPrcb = KeGetCurrentPrcb();
WaitKey = v5->WaitKey;
Thread = v5->Thread;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
if( Thread->Tcb.WaitBlockFill6[68] == 5 )
KiSignalThread(Prcb, Thread, WaitKey, v5);
Thread->Tcb.ThreadLock = 0i64;
++v5->BlockState;
}
}
while( Blink != (_KWAIT_BLOCK *)((char *)Queue + 8) );
}Referenced by:
CcUnpinFileDataEx
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
IoSetIoCompletionEx
IoSetIoCompletionEx2
IopfCompleteRequest
KeDeleteMutant
KeInsertHeadQueue
KeInsertQueue
KeInsertQueueEx
KePulseEvent
KeRegisterObjectNotification
KeReleaseMutant
KeReleaseSemaphore
KeReleaseSemaphoreEx
KeRundownQueueCommon
KeSetEvent
KeSetEventBoostPriorityEx
KeSetProcess
KeSignalGate
KeTerminateThread
KeWakeWaitChain
KiExpireTimer2
KiInsertQueueInternal
KiResumeThread
KiRundownMutants
KiTimerWaitTest
NtAssociateWaitCompletionPacket
NtReleaseWorkerFactoryWorker
NtWaitForWorkViaWorkerFactory