KiActivateWaiterQueueWithNoLocks
VOID __stdcall KiActivateWaiterQueueWithNoLocks(
_ETHREAD *Thread,
_DISPATCHER_HEADER *Queue,
_LIST_ENTRY *DisassociateEntry){
volatile LONG *v5;
__int64 v6;
_KTHREAD *v7;
char v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
__int64 v11;
UINT64 SpinCount;
v5 = (volatile LONG *)&KiObjectRundownLocks[8 * (((unsigned __int64)Queue >> 4) & 0x3F)];
ExAcquireSpinLockSharedAtDpcLevel(v5);
v6 = *((_QWORD *)Thread + 29);
if( v6 )
{
KiAcquireKobjectLockSafe(*((PVOID *)Thread + 29));
if( !*((_QWORD *)Thread + 29) )
{
_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 + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
v11 = (unsigned __int8)*((_DWORD *)Thread + 135);
*((_DWORD *)Thread + 135) = (unsigned __int8)*((_DWORD *)Thread + 135) | 0x100;
_InterlockedDecrement((volatile signed __int32 *)(v6 + 4 * v11 + 536));
KiReleaseThreadLockSafe((INT64)Thread);
}
else
{
_InterlockedDecrement((volatile signed __int32 *)(v6 + 40));
}
Flink = DisassociateEntry->Flink;
Blink = DisassociateEntry->Blink;
if( DisassociateEntry->Flink->Blink != DisassociateEntry || Blink->Flink != DisassociateEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
*((_QWORD *)Thread + 29) = 0i64;
}
if( (*(_BYTE *)v6 & 0x7F) == 21 )
KiActivateWaiterPriQueue((_KPRIQUEUE *)v6, (_KTHREAD *)v7);
else
KiActivateWaiterKQueue((KQUEUE *)v6);
}
}Referenced by:
KeTerminateThread
KiCommitThreadWait
KiPriQueueThreadPriorityChanged
KiSwitchPriQueue