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.