KeUpdateThreadTag
VOID __stdcall KeUpdateThreadTag(_ETHREAD *Thread, _KTHREAD_TAG NewTag){
INT64 v3;
unsigned __int8 CurrentIrql;
_KPRCB *CurrentPrcb;
volatile unsigned __int8 v6;
struct _KPRCB *v7;
char v8;
volatile unsigned __int8 v9;
volatile unsigned int NextProcessor;
INT64 a5;
INT64 v12;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
_KAFFINITY_EX Affinity;
INT64 v17;
LODWORD(v17) = NewTag;
memset(&Affinity, 0i64, sizeof(Affinity));
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
if( (unsigned __int8)Thread->Tcb.Tag != (_DWORD)v17 )
{
if( Thread == (_ETHREAD *)KeGetCurrentThread() )
{
CurrentPrcb = KeGetCurrentPrcb();
ControlPrcb = CurrentPrcb;
_disable();
KiEndThreadCycleAccumulation((INT64)CurrentPrcb, (INT64)Thread, 0i64, v3, a5, v12, SpinCount);
v6 = v17;
if( (_DWORD)v17 )
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x14u);
else
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x14u);
Thread->Tcb.Tag = v6;
KiStartThreadCycleAccumulation(CurrentPrcb, &Thread->Tcb, 0);
_enable();
}
else
{
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
if( v8 == 2 || Thread->Tcb.Running )
{
NextProcessor = Thread->Tcb.NextProcessor;
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
KeAddProcessorAffinityEx(&Affinity.Count, NextProcessor & 0x7FFFFFFF);
KeGetCurrentIrql();
__writecr8(0xCui64);
KiIpiSendPacket(IpiAffinity, &Affinity, (INT64)KiIpiUpdateThreadTag, (INT64)Thread, (INT64)&v17, 0i64);
v7 = KeGetCurrentPrcb();
while( v7->PacketBarrier )
_mm_pause();
}
else
{
v9 = v17;
if( (_DWORD)v17 )
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x14u);
else
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x14u);
Thread->Tcb.Tag = v9;
}
KiReleaseThreadStateLock(v7, (_KSHARED_READY_QUEUE *)ControlPrcb);
}
}
KiReleaseThreadLockSafe((INT64)Thread);
__writecr8(CurrentIrql);
}Referenced by:
No references.