HalpTscAdvSynchLeader

VOID __stdcall HalpTscAdvSynchLeader(INT64 a1){
  UINT64 Number; 
  unsigned int v3; 
  __int64 v4; 
  UINT64 TimeStamp; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned int i; 
  unsigned int v9; 
  int v10; 
  INT64 *Timer; 
  INT64 *v12; 
  INT64 v13; 
  REGHANDLE v14; 
  unsigned __int64 v15; 
  UINT64 v16; 
  int ActivityId; 
  UINT64 v18; 
  INT64 v19; 
  __int64 v20; 
  unsigned int v21; 
  int v22; 
  int v23; 
  int v24; 
  int v25; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  int *v27; 
  __int64 v28; 
  int *v29; 
  __int64 v30; 
  int *v31; 
  __int64 v32; 
  int *v33; 
  __int64 v34; 

  Number = KeGetCurrentPrcb()->Number;
  v3 = 0;
  TimeStamp = HalpTscAdvSynchReadTimeStamp(Number);
  if( HalpTscRequestedSynchronization )
  {
    if( *(_BYTE *)(a1 + 34) )
    {
      HalpTscAdvSynchToLeader(*(unsigned int *)(a1 + 36));
    }
    else
    {
      v19 = 0i64;
      v20 = 0i64;
      v6 = *(_DWORD *)(a1 + 40);
      LODWORD(v18) = KeGetCurrentPrcb()->Number;
      HalpTscAdvSynchCalculateRemoteDeltas(&v19, &v20, (unsigned int *)&v18, v4, ActivityId, v6);
      v7 = v18;
      if( (_DWORD)v18 != KeGetCurrentPrcb()->Number )
      {
        v16 = HalpTscAdvSynchReadTimeStamp((unsigned int)Number) - TimeStamp;
        LODWORD(Number) = v7;
        TimeStamp = HalpTscAdvSynchReadTimeStamp(v7) - v16;
        if( byte_140C4A424 )
          HalpTscAdjustToTarget(v7);
        else
          HalpTscAdvSynchToTarget(v7);
      }
      for( i = 0; i < *(_DWORD *)(a1 + 40); ++i )
      {
        if( i != KeGetCurrentPrcb()->Number && i != (_DWORD)v18 )
        {
          if( byte_140C4A424 )
            HalpTscAdjustToLeader(i);
          else
            HalpTscAdvSynchToLeader(i);
        }
      }
    }
  }
  v19 = 0i64;
  v20 = 0i64;
  v9 = *(_DWORD *)(a1 + 40);
  LODWORD(v18) = KeGetCurrentPrcb()->Number;
  HalpTscAdvSynchCalculateRemoteDeltas(&v19, &v20, (unsigned int *)&v18, v4, ActivityId, v9);
  v10 = 1000000 * (HalpTscAdvSynchReadTimeStamp((unsigned int)Number) - TimeStamp) / *(_QWORD *)KeGetPcr()->HalReserved;
  Timer = HalpFindTimer(5, 0, 0, 0, 1);
  v12 = Timer;
  v13 = v20 - v19;
  qword_140C4A408 = (PVOID)(v20 - v19);
  if( v20 - v19 > (unsigned __int64)(unsigned int)dword_140C4A3F0 )
  {
    *((_DWORD *)Timer + 46) &= ~0x20u;
    byte_140C4A3E8 = 1;
    HalpTscTraceStatus(&HAL_ETW_EVENT_TIMER_SYNCH_FAILED, v13);
  }
  else
  {
    v24 = v19;
    v23 = v20;
    v22 = v18;
    v21 = KeGetCurrentPrcb()->Number;
    v25 = v10;
    if( byte_140C4A328 )
    {
      v14 = qword_140C4A320;
      if( EtwEventEnabled(qword_140C4A320, &HAL_ETW_EVENT_TIMER_SYNCH_SUMMARY) )
      {
        *(_QWORD *)&UserData.Size = 4i64;
        UserData.Ptr = (unsigned __int64)&v21;
        v28 = 4i64;
        v27 = &v22;
        v30 = 4i64;
        v29 = &v23;
        v32 = 4i64;
        v31 = &v24;
        v34 = 4i64;
        v33 = &v25;
        EtwWriteEx(v14, &HAL_ETW_EVENT_TIMER_SYNCH_SUMMARY, 0i64, 0, 0, 0, 5u, &UserData);
      }
    }
    *((_DWORD *)v12 + 46) |= 0x20u;
  }
  if( *(_DWORD *)(a1 + 40) )
  {
    do
    {
      if( v3 != KeGetCurrentPrcb()->Number )
      {
        v15 = (unsigned __int64)v3 << 7;
        _InterlockedExchange((volatile __int32 *)(v15 + qword_140C4A418), 8);
        while( *(_DWORD *)(v15 + qword_140C4A418) == 8 )
          _mm_pause();
      }
      ++v3;
    }
    while( v3 < *(_DWORD *)(a1 + 40) );
  }
}

Referenced by:

HalpTscSynchronizationWorker