KiWakeQueueWaiter
VOID __fastcall KiWakeQueueWaiter(_KPRCB *Prcb, _KQUEUE *Queue, INT64 Entry){
_KWAIT_BLOCK *Flink;
_KWAIT_BLOCK *v4;
_KWAIT_BLOCK *v7;
_LIST_ENTRY *Blink;
char v9;
struct _KPRCB *CurrentPrcb;
INT64 Thread;
char v12;
_DWORD *SchedulerAssist;
UINT64 SpinCount;
Flink = (_KWAIT_BLOCK *)*((_QWORD *)Queue + 1);
v4 = (_KWAIT_BLOCK *)((char *)Queue + 8);
do
{
v7 = Flink;
Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
if( v7->WaitType != 3 )
break;
Blink = v7->WaitListEntry.Blink;
if( (_KWAIT_BLOCK *)Flink->WaitListEntry.Blink != v7 || (_KWAIT_BLOCK *)Blink->Flink != v7 )
__fastfail(3u);
Blink->Flink = &Flink->WaitListEntry;
v9 = 0;
Flink->WaitListEntry.Blink = Blink;
CurrentPrcb = KeGetCurrentPrcb();
Thread = (INT64)v7->Thread;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(Thread + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(Thread + 64) );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
if( *(_BYTE *)(Thread + 388) == 5 )
{
KiSignalThread(Prcb, (_ETHREAD *)Thread, Entry, v7);
v9 = v12;
}
KiReleaseThreadLockSafe(Thread);
++v7->BlockState;
if( v9 )
break;
}
while( Flink != v4 );
}Referenced by:
CcUnpinFileDataEx
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
IoSetIoCompletionEx
IoSetIoCompletionEx2
IopfCompleteRequest
KeDeleteMutant
KeInsertHeadQueue
KeInsertQueue
KeInsertQueueEx
KePulseEvent
KeRegisterObjectNotification
KeReleaseMutant
KeReleaseSemaphore
KeReleaseSemaphoreEx
KeRundownQueueCommon
KeSetEvent
KeSetEventBoostPriorityEx
KeSetProcess
KeSignalGate
KeTerminateThread
KeWakeWaitChain
KiActivateWaiterKQueue
KiCommitThreadWait
KiExpireTimer2
KiInsertQueueInternal
KiResumeThread
KiRundownMutants
KiTimerWaitTest
NtAssociateWaitCompletionPacket
NtReleaseWorkerFactoryWorker
NtWaitForWorkViaWorkerFactory