HalpTscAdvSynchLeader
VOID __fastcall HalpTscAdvSynchLeader(INT64 rcx0){
UINT64 v2;
unsigned int v3;
INT64 v4;
UINT64 TimeStamp;
int v6;
unsigned int v7;
unsigned int i;
int v9;
int v10;
ULONG_PTR *Timer;
EVENT_DESCRIPTOR *v12;
ULONG_PTR *v13;
UINT64 v14;
unsigned __int64 v15;
UINT64 v16;
LPCGUID ActivityId;
LPCGUID RelatedActivityId;
UINT64 UserDataCount;
UINT64 a3;
INT64 a1;
INT64 a2;
int v23;
int v24;
int v25;
int v26;
int v27;
EVENT_DATA_DESCRIPTOR UserData;
int *v29;
__int64 v30;
int *v31;
__int64 v32;
int *v33;
__int64 v34;
int *v35;
__int64 v36;
v2 = *((unsigned int *)KeGetCurrentPrcb() + 9);
v3 = 0;
TimeStamp = HalpTscAdvSynchReadTimeStamp(v2);
if( HalpTscRequestedSynchronization )
{
if( *(_BYTE *)(rcx0 + 34) )
{
HalpTscAdvSynchToLeader(*(unsigned int *)(rcx0 + 36));
}
else
{
a1 = 0i64;
a2 = 0i64;
v6 = *(_DWORD *)(rcx0 + 40);
LODWORD(a3) = *((_DWORD *)KeGetCurrentPrcb() + 9);
LODWORD(RelatedActivityId) = v6;
HalpTscAdvSynchCalculateRemoteDeltas(&a1, &a2, &a3, v4, (INT64)ActivityId, (UINT64)RelatedActivityId);
v7 = a3;
if( (_DWORD)a3 != *((_DWORD *)KeGetCurrentPrcb() + 9) )
{
v16 = HalpTscAdvSynchReadTimeStamp((unsigned int)v2) - TimeStamp;
LODWORD(v2) = v7;
TimeStamp = HalpTscAdvSynchReadTimeStamp(v7) - v16;
if( HalpTscAdjustAvailable )
HalpTscAdjustToTarget(v7);
else
HalpTscAdvSynchToTarget(v7);
}
for( i = 0; i < *(_DWORD *)(rcx0 + 40); ++i )
{
if( i != *((_DWORD *)KeGetCurrentPrcb() + 9) && i != (_DWORD)a3 )
{
if( HalpTscAdjustAvailable )
HalpTscAdjustToLeader(i);
else
HalpTscAdvSynchToLeader(i);
}
}
}
}
a1 = 0i64;
a2 = 0i64;
v9 = *(_DWORD *)(rcx0 + 40);
LODWORD(a3) = *((_DWORD *)KeGetCurrentPrcb() + 9);
LODWORD(RelatedActivityId) = v9;
HalpTscAdvSynchCalculateRemoteDeltas(&a1, &a2, &a3, v4, (INT64)ActivityId, (UINT64)RelatedActivityId);
v10 = 1000000 * (HalpTscAdvSynchReadTimeStamp((unsigned int)v2) - TimeStamp) / *((_QWORD *)KeGetPcr() + 24);
Timer = HalpFindTimer(5, 0, 0, 0, 1);
v13 = Timer;
HalpTscMaximumComputedSpread = a2 - a1;
if( a2 - a1 > (unsigned __int64)(unsigned int)HalpTscMaximumCounterSyncSpread )
{
*((_DWORD *)Timer + 46) &= ~0x20u;
HalpTscSynchronizationFailureFallback = 1;
HalpTscTraceStatus(&HAL_ETW_EVENT_TIMER_SYNCH_FAILED);
}
else
{
v26 = a1;
v25 = a2;
v24 = a3;
v23 = *((_DWORD *)KeGetCurrentPrcb() + 9);
v27 = v10;
if( HalpDiagnosticEventsRegistered )
{
v14 = HalpDiagnosticEventHandle;
if( EtwEventEnabled(HalpDiagnosticEventHandle, (EVENT_DESCRIPTOR *)&HAL_ETW_EVENT_TIMER_SYNCH_SUMMARY, v12) )
{
*(_QWORD *)&UserData.Size = 4i64;
UserData.Ptr = (unsigned __int64)&v23;
v30 = 4i64;
v29 = &v24;
v32 = 4i64;
v31 = &v25;
v34 = 4i64;
v33 = &v26;
v36 = 4i64;
v35 = &v27;
LODWORD(UserDataCount) = 5;
EtwWriteEx(
v14,
(EVENT_DESCRIPTOR *)&HAL_ETW_EVENT_TIMER_SYNCH_SUMMARY,
0i64,
0i64,
0i64,
0i64,
UserDataCount,
&UserData);
}
}
*((_DWORD *)v13 + 46) |= 0x20u;
}
if( *(_DWORD *)(rcx0 + 40) )
{
do
{
if( v3 != *((_DWORD *)KeGetCurrentPrcb() + 9) )
{
v15 = (unsigned __int64)v3 << 7;
_InterlockedExchange((volatile __int32 *)(v15 + TscRequest), 8);
while( *(_DWORD *)(v15 + TscRequest) == 8 )
_mm_pause();
}
++v3;
}
while( v3 < *(_DWORD *)(rcx0 + 40) );
}
}Referenced by:
HalpTscSynchronizationWorker