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