HalpTscAdvSynchToLeader
NTSTATUS __stdcall HalpTscAdvSynchToLeader(UINT64 a1){
unsigned __int64 v1;
__int64 v2;
INT64 v3;
__int64 v4;
unsigned int i;
__int64 v6;
INT64 v7;
__int64 v8;
unsigned int v9;
unsigned __int32 v10;
NTSTATUS result;
signed __int32 v12[22];
v1 = (unsigned __int64)(unsigned int)a1 << 7;
v2 = (unsigned int)a1;
*(_QWORD *)(v1 + qword_140C4A418 + 8) = 0i64;
_InterlockedOr(v12, 0);
_InterlockedExchange((volatile __int32 *)(v1 + qword_140C4A418), 1);
while( *(_DWORD *)(v1 + qword_140C4A418) == 1 )
_mm_pause();
v3 = 0i64;
v4 = 0x7FFFFFFFFFFFFFFFi64;
for( i = 0; i < HalpTscSyncRecalculateSkews; ++i )
{
v6 = v4;
v7 = HalpTscAdvSynchCalculateRemoteDelta(v2, (unsigned int)HalpTscRequestedIterations, 0i64);
v8 = qword_140C4A418;
*(_QWORD *)(v1 + qword_140C4A418 + 8) = 0i64;
*(_DWORD *)(v1 + v8 + 4) = 100;
_InterlockedOr(v12, 0);
_InterlockedExchange((volatile __int32 *)(v1 + qword_140C4A418), 2);
while( *(_DWORD *)(v1 + qword_140C4A418) == 2 )
_mm_pause();
v3 = HalpTscAdvSynchCalculateRemoteDelta(v2, (unsigned int)HalpTscRequestedIterations, 0i64);
v4 = (v7 - v3) / 100;
if( v4 >= v6 )
v4 = v6;
}
v9 = 0;
v10 = 0;
*(_DWORD *)(qword_140C4A3E0 + 4 * v2) = v4;
do
{
if( !v9 )
{
*(_QWORD *)(v1 + qword_140C4A418 + 8) = v4 - v3;
_InterlockedOr(v12, 0);
_InterlockedExchange((volatile __int32 *)(v1 + qword_140C4A418), 1);
while( *(_DWORD *)(v1 + qword_140C4A418) == 1 )
_mm_pause();
}
v3 = HalpTscAdvSynchCalculateRemoteDelta(v2, (unsigned int)HalpTscRequestedIterations, 0i64);
if( !v9 )
{
v12[8] = v10;
HalpTscTraceProcessorSynchronization(KeGetCurrentPrcb()->Number, (unsigned int)v2, v3);
}
++v9;
if( (unsigned __int64)(v3 + 24) > 0x30 )
v9 = 0;
++v10;
}
while( v10 < 0x32 && v9 < 2 );
result = qword_140C4A3D8;
*(_DWORD *)(qword_140C4A3D8 + 4 * v2) = v10;
return result;
}Referenced by:
HalpTscAdvSynchLeader