KiActivateWaiterQueueWithNoLocks
VOID __stdcall KiActivateWaiterQueueWithNoLocks(
_ETHREAD *Thread,
_DISPATCHER_HEADER *Queue,
_LIST_ENTRY *DisassociateEntry){
volatile int *v5;
_DISPATCHER_HEADER *volatile v6;
_ETHREAD *v7;
char v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
__int64 QueuePriority;
UINT64 SpinCount;
v5 = (volatile int *)((char *)&KiObjectRundownLocks + 64 * (((unsigned __int64)Queue >> 4) & 0x3F));
ExAcquireSpinLockSharedAtDpcLevel(v5);
v6 = Thread->Tcb.Queue;
if( v6 )
{
KiAcquireKobjectLockSafe(Thread->Tcb.Queue);
if( !Thread->Tcb.Queue )
{
_InterlockedAnd((volatile signed __int32 *)v6, 0xFFFFFF7F);
v6 = 0i64;
}
}
ExReleaseSpinLockSharedFromDpcLevel(v5);
if( v6 )
{
if( DisassociateEntry )
{
v8 = *(_BYTE *)v6 & 0x7F;
if( v8 == 21 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
QueuePriority = (unsigned __int8)Thread->Tcb.QueuePriority;
Thread->Tcb.QueuePriority = (unsigned __int8)Thread->Tcb.QueuePriority | 0x100;
_InterlockedDecrement((volatile signed __int32 *)v6 + QueuePriority + 134);
KiReleaseThreadLockSafe((INT64)Thread);
}
else
{
_InterlockedDecrement((volatile signed __int32 *)v6 + 10);
}
Flink = DisassociateEntry->Flink;
Blink = DisassociateEntry->Blink;
if( DisassociateEntry->Flink->Blink != DisassociateEntry || Blink->Flink != DisassociateEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
Thread->Tcb.Queue = 0i64;
}
if( (*(_BYTE *)v6 & 0x7F) == 21 )
KiActivateWaiterPriQueue((ULONG_PTR)v6, v7);
else
KiActivateWaiterKQueue((_KQUEUE *)v6);
}
}Referenced by:
KeTerminateThread
KiCommitThreadWait
KiPriQueueThreadPriorityChanged
KiSwitchPriQueue