KiSwitchPriQueue

VOID __stdcall KiSwitchPriQueue(_ETHREAD *Thread, VOID *NewQueue, _DISPATCHER_HEADER *OldQueue){
  _LIST_ENTRY *p_QueueListEntry; 
  __int64 BasePriority; 
  VOID **v7; 
  UINT64 SpinCount; 

  p_QueueListEntry = &Thread->Tcb.QueueListEntry;
  if( OldQueue )
    KiActivateWaiterQueueWithNoLocks(&Thread->Tcb, OldQueue, &Thread->Tcb.QueueListEntry);
  KiAcquireKobjectLockSafe(NewQueue);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( Thread->Tcb.ThreadLock );
  }
  Thread->Tcb.Queue = (_DISPATCHER_HEADER *volatile)NewQueue;
  BasePriority = Thread->Tcb.BasePriority;
  Thread->Tcb.QueuePriority = BasePriority;
  _InterlockedIncrement((volatile signed __int32 *)NewQueue + BasePriority + 134);
  KiReleaseThreadLockSafe((INT64)Thread);
  v7 = (VOID **)*((_QWORD *)NewQueue + 85);
  if( *v7 != (char *)NewQueue + 672 )
    __fastfail(3u);
  p_QueueListEntry->Flink = (_LIST_ENTRY *)((char *)NewQueue + 672);
  p_QueueListEntry->Blink = (_LIST_ENTRY *)v7;
  *v7 = p_QueueListEntry;
  *((_QWORD *)NewQueue + 85) = p_QueueListEntry;
  _InterlockedAnd((volatile signed __int32 *)NewQueue, 0xFFFFFF7F);
}

Referenced by:

KeRemovePriQueue