EtwpCCSwapTrace

VOID __stdcall EtwpCCSwapTrace(_ETHREAD *OldEThread, _ETHREAD *NewEThread, UINT64 ClockType, _LARGE_INTEGER *TimeStamp){
  unsigned int v4; 
  int v5; 
  __int64 v8; 
  _QWORD *EtwSupport; 
  _LARGE_INTEGER *v10; 
  LONGLONG QuadPart; 
  _LARGE_INTEGER *v12; 
  __int64 v13; 
  unsigned int UniqueThread; 
  unsigned int v15; 
  char Priority; 
  unsigned int v17; 
  int v18; 
  volatile unsigned __int8 v19; 
  int v20; 
  size_t v21; 
  volatile unsigned __int8 State; 
  unsigned int v23; 
  LONGLONG v24; 
  unsigned int v25; 
  unsigned int LowPart; 
  __int64 Src; 
  int v28; 

  v28 = ClockType;
  v4 = 0;
  v5 = ClockType;
  Src = 0i64;
  v8 = (unsigned int)ClockType;
  EtwSupport = KeGetCurrentPrcb()->EtwSupport;
  v10 = (_LARGE_INTEGER *)EtwSupport[(unsigned int)ClockType + 37];
  if( v10 )
  {
    QuadPart = TimeStamp->QuadPart;
    v12 = v10 + 3;
    if( v10->anonymous_0.LowPart )
    {
      v13 = QuadPart - v10[1].QuadPart;
    }
    else
    {
      LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
      v10[1].QuadPart = QuadPart;
      v10[2].QuadPart = QuadPart;
      v10->anonymous_0.HighPart = LowPart;
      v10->anonymous_0.LowPart = 104;
      memset(&v10[3], 0i64, 0x40u);
      v5 = v28;
      v13 = 0i64;
    }
    UniqueThread = (unsigned int)OldEThread->Cid.UniqueThread;
    v15 = 0;
    if( UniqueThread )
    {
      while( v12->anonymous_0.LowPart != UniqueThread )
      {
        if( !v12->anonymous_0.LowPart )
        {
          *(&v10[3].anonymous_0.LowPart + v15) = UniqueThread;
          *((_BYTE *)&v10[11].anonymous_0.LowPart + v15) = OldEThread->Tcb.BasePriority;
          break;
        }
        ++v15;
        v12 = (_LARGE_INTEGER *)((char *)v12 + 4);
        if( v15 >= 0x10 )
          break;
      }
    }
    if( v15 == 16
      || KUSER_SHARED_DATA.TickCount.LowPart - v10->anonymous_0.HighPart > 0x1F4
      || (unsigned __int64)v10->anonymous_0.LowPart + 8 > 0x400
      || v13 > 0x40000000
      || *((_BYTE *)EtwSupport + v8 + 288) )
    {
      EtwpCCSwapFlush(v10, v5);
      v24 = TimeStamp->QuadPart;
      v25 = KUSER_SHARED_DATA.TickCount.LowPart;
      v10[1] = *TimeStamp;
      v10[2].QuadPart = v24;
      v10->anonymous_0.HighPart = v25;
      v10->anonymous_0.LowPart = 104;
      memset(&v10[3], 0i64, 0x40u);
      *((_BYTE *)EtwSupport + v8 + 288) = 0;
      v13 = 0i64;
      v10[3].anonymous_0.LowPart = UniqueThread;
      v15 = 0;
    }
    if( UniqueThread )
    {
      if( LODWORD(NewEThread->Cid.UniqueThread) )
        v4 = KUSER_SHARED_DATA.TickCount.LowPart - NewEThread->Tcb.WaitBlock[2].SpareLong;
      Priority = OldEThread->Tcb.Priority;
      v17 = Priority - *((char *)&v10[11].QuadPart + v15);
      if( v4 > 1 || v17 > 7 || v13 >= 0x20000 )
      {
        LODWORD(Src) = (4 * v13) | 3;
        if( v4 >= 0x1FFFF )
          v4 = 0x1FFFF;
        State = OldEThread->Tcb.State;
        HIDWORD(Src) = (WORD2(Src) ^ ((unsigned __int8)v15 ^ BYTE4(Src)) & 0xF) & 0x3FF | (((32 * v4) | Priority & 0x1F) << 10);
        if( State == 5 )
          v23 = (WORD2(Src) ^ (unsigned __int16)(16 * OldEThread->Tcb.WaitReason)) & 0x3F0 ^ HIDWORD(Src);
        else
          v23 = (16 * OldEThread->Tcb.WaitBlockFill6[68] - 369) & 0x3F0 | HIDWORD(Src) & 0xFFFFFC0F;
        HIDWORD(Src) = v23;
        v21 = 8;
      }
      else
      {
        v18 = v17 & 7 | ((_DWORD)v13 << 9);
        v19 = OldEThread->Tcb.State;
        LODWORD(Src) = (4 * (v15 & 0xF | (16 * v18))) | 2;
        if( v19 == 5 )
          v20 = ((unsigned __int16)Src ^ (unsigned __int16)(OldEThread->Tcb.WaitReason << 9)) & 0x7E00 ^ Src;
        else
          v20 = ((OldEThread->Tcb.WaitBlockFill6[68] << 9) - 11777) & 0x7E00 | Src & 0xFFFF81FF;
        LODWORD(Src) = v20;
        v21 = 4;
      }
    }
    else if( v13 >= 0x4000 )
    {
      v21 = 4;
      LODWORD(Src) = (4 * v13) | 1;
    }
    else
    {
      v21 = 2;
      LOWORD(Src) = 4 * v13;
    }
    memmove((char *)v10 + v10->anonymous_0.LowPart, &Src, v21);
    v10->anonymous_0.LowPart += v21;
    v10[1] = *TimeStamp;
  }
}

Referenced by:

EtwpLogContextSwapEvent