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