KiWakeQueueWaiter
UINT8 __stdcall KiWakeQueueWaiter(_KPRCB *Prcb, _KQUEUE *Queue, INT64 Entry){
_LIST_ENTRY *Flink;
_LIST_ENTRY *p_WaitListHead;
_KWAIT_BLOCK *v7;
_LIST_ENTRY *Blink;
char v10;
struct _KPRCB *CurrentPrcb;
INT64 Thread;
char v13;
__int64 v14;
UINT64 SpinCount;
Flink = Queue->Header.WaitListHead.Flink;
p_WaitListHead = &Queue->Header.WaitListHead;
while( 1 )
{
v7 = (_KWAIT_BLOCK *)Flink;
Flink = Flink->Flink;
if( v7->WaitType != 3 )
return 0;
Blink = v7->WaitListEntry.Blink;
if( (_KWAIT_BLOCK *)Flink->Blink != v7 || (_KWAIT_BLOCK *)Blink->Flink != v7 )
__fastfail(3u);
Blink->Flink = Flink;
v10 = 0;
Flink->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) );
v14 = *((_QWORD *)CurrentPrcb + 4247);
if( v14 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v14 + 24);
}
if( *(_BYTE *)(Thread + 388) == 5 )
{
KiSignalThread(Prcb, (_ETHREAD *)Thread, Entry, v7);
v10 = v13;
}
KiReleaseThreadLockSafe(Thread);
++v7->BlockState;
if( v10 )
break;
if( Flink == p_WaitListHead )
return 0;
}
return 1;
}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