KiTryUnwaitThreadWithPriority

UINT8 __stdcall KiTryUnwaitThreadWithPriority(_KPRCB *Prcb, _KWAIT_BLOCK *WaitBlock, INT64 WaitStatus, INT64 NewBase){
  struct _KPRCB *CurrentPrcb; 
  _ETHREAD *Thread; 
  UINT8 v7; 
  __int64 v8; 
  __int64 QueuePriority; 
  UINT8 v12; 
  _KPRCB *v13; 
  char PriorityDecrement; 
  _SINGLE_LIST_ENTRY *p_IoSelfBoostsEntry; 
  _SINGLE_LIST_ENTRY *p_AbSelfIoBoostsList; 
  unsigned __int64 v18; 
  int v19; 
  _DWORD *SchedulerAssist; 
  _DISPATCHER_HEADER *volatile Queue; 
  UINT64 SpinCount; 

  CurrentPrcb = KeGetCurrentPrcb();
  Thread = WaitBlock->Thread;
  v7 = 0;
  v8 = (int)NewBase;
  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 )
  {
    QueuePriority = (unsigned __int8)Thread->Tcb.QueuePriority;
    if( (_DWORD)QueuePriority != (_DWORD)v8 )
    {
      v19 = Thread->Tcb.QueuePriority & 0x100;
      if( !v19 )
      {
        Queue = Thread->Tcb.Queue;
        _InterlockedDecrement((volatile signed __int32 *)Queue + QueuePriority + 134);
        _InterlockedIncrement((volatile signed __int32 *)Queue + v8 + 134);
      }
      Thread->Tcb.QueuePriority = v19 | (unsigned __int8)v8;
    }
    KiSignalThread(Prcb, Thread, WaitStatus, WaitBlock);
    v7 = v12;
    if( v12 )
    {
      Thread->Tcb.Saturation = 0;
      v13 = KeGetCurrentPrcb();
      if( (char)v8 < Thread->Tcb.BasePriority )
      {
        if( Thread->Tcb.AbOwnedEntryCount )
        {
          p_IoSelfBoostsEntry = &Thread->Tcb.IoSelfBoostsEntry;
          if( Thread->Tcb.IoSelfBoostsEntry.Next == (_SINGLE_LIST_ENTRY *)1 )
          {
            p_AbSelfIoBoostsList = &v13->AbSelfIoBoostsList;
            if( v13 != (_KPRCB *)-34672i64 )
            {
              p_IoSelfBoostsEntry->Next = p_AbSelfIoBoostsList->Next;
              p_AbSelfIoBoostsList->Next = p_IoSelfBoostsEntry;
              _InterlockedIncrement16(&Thread->Tcb.KeReferenceCount);
              KiAbQueueAutoBoostDpc(v13);
            }
          }
        }
      }
      PriorityDecrement = Thread->Tcb.PriorityDecrement;
      Thread->Tcb.BasePriority = v8;
      if( PriorityDecrement )
      {
        if( (PriorityDecrement & 0xF) != 0 )
          Thread->Tcb.ForegroundLossTime = KUSER_SHARED_DATA.TickCount.LowPart;
        Thread->Tcb.PriorityDecrement = 0;
      }
      if( (_DWORD)v8 != Thread->Tcb.Priority )
      {
        v18 = Thread->Tcb.CycleTime + KiCyclesPerClockQuantum * (unsigned int)Thread->Tcb.SchedulerApc.SpareByte1;
        if( (*(&Thread->Tcb.MiscFlags + 1) & 0x20) != 0 )
          _interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 5u);
        Thread->Tcb.QuantumTarget = v18;
        KiSetPriorityThread(&Thread->Tcb, 0i64, (unsigned int)v8);
      }
    }
  }
  Thread->Tcb.ThreadLock = 0i64;
  ++WaitBlock->BlockState;
  return v7;
}

Referenced by:

ExpQueueWorkItem
KiWakePriQueueWaiter