KiExitThreadWait

VOID __stdcall KiExitThreadWait(_KPRCB *Prcb, _ETHREAD *Thread, UINT8 ExitScheduler){
  unsigned __int64 v3; 
  char v5; 
  UINT64 SpinCount; 
  _SINGLE_LIST_ENTRY ReadyList; 
  v3 = *((unsigned __int8 *)Thread + 390);
  v5 = *((_BYTE *)Thread + 112);
  if( (v5 & 0x38) != 0 )
  {
    if( (v5 & 0x18) != 0 )
    {
      if( (v5 & 8) != 0 )
        _interlockedbittestandset((volatile signed __int32 *)Thread + 30, 0xCu);
      ReadyList.Next = 0i64;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((_QWORD *)Prcb + 6) );
      }
      if( !*((_QWORD *)Prcb + 2) )
        KiSelectNextThread(Prcb, &ReadyList);
      _InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
      KiProcessDeferredReadyList((__int64)Prcb, &ReadyList, v3);
    }
    else
    {
      KiCheckForThreadDispatch(Prcb, 1u);
      KiDeliverApc(0, 0i64, 0i64);
      __writecr8(0i64);
    }
  }
  else if( ExitScheduler )
  {
    KiCheckForThreadDispatch(Prcb, *((_BYTE *)Thread + 390));
  }
  else
  {
    __writecr8(v3);
  }
}

Referenced by:

KiCommitThreadWait
KiFastExitThreadWait
KiSatisfyThreadWait