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