KiExitThreadWait

VOID __stdcall KiExitThreadWait(_KPRCB *Prcb, _ETHREAD *Thread, UINT8 ExitScheduler){
  unsigned __int64 WaitIrql; 
  _KWAIT_STATUS_REGISTER v5; 
  UINT64 SpinCount; 
  _SINGLE_LIST_ENTRY ReadyList; 

  WaitIrql = Thread->Tcb.WaitIrql;
  v5.Flags = (unsigned __int8)Thread->Tcb.WaitRegister;
  if( (v5.Flags & 0x38) != 0 )
  {
    if( (v5.Flags & 0x18) != 0 )
    {
      if( (v5.Flags & 8) != 0 )
        _interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xCu);
      ReadyList.Next = 0i64;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&Prcb->PrcbLock, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( Prcb->PrcbLock );
      }
      if( !Prcb->NextThread )
        KiSelectNextThread(Prcb, &ReadyList);
      _InterlockedAnd64((volatile signed __int64 *)&Prcb->PrcbLock, 0i64);
      KiProcessDeferredReadyList(Prcb, &ReadyList, WaitIrql);
    }
    else
    {
      KiCheckForThreadDispatch(Prcb, 1u);
      KiDeliverApc(0, 0i64, 0i64);
      __writecr8(0i64);
    }
  }
  else if( ExitScheduler )
  {
    KiCheckForThreadDispatch(Prcb, Thread->Tcb.WaitIrql);
  }
  else
  {
    __writecr8(WaitIrql);
  }
}

Referenced by:

KiCommitThreadWait
KiFastExitThreadWait
KiSatisfyThreadWait