HalpTscAdvSynchCalculateRemoteDelta
INT64 __fastcall HalpTscAdvSynchCalculateRemoteDelta(unsigned int a1, INT64 a2, _DWORD *a3){
__int64 v4;
unsigned __int64 v5;
__int64 Number;
__int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v12;
int v13[10];
v4 = a1;
if( dword_140C4A3EC )
{
if( dword_140C4A3EC == 1 )
{
v12 = qword_140C4A418;
v5 = v4 << 7;
*(_DWORD *)((v4 << 7) + qword_140C4A418 + 4) = 0;
_InterlockedExchange((volatile __int32 *)((v4 << 7) + v12), 4);
if( *(_DWORD *)((v4 << 7) + qword_140C4A418) == 4 )
{
do
_mm_pause();
while( *(_DWORD *)(v5 + qword_140C4A418) == 4 );
}
LODWORD(v8) = HalpTscAdvSynchComputeMinimumDelta((unsigned int)v4, a2);
goto LABEL_5;
}
if( dword_140C4A3EC != 2 )
return -1i64;
}
v5 = (unsigned __int64)a1 << 7;
Number = KeGetCurrentPrcb()->Number;
v7 = qword_140C4A418;
*(_DWORD *)((v4 << 7) + qword_140C4A418 + 4) = Number;
**(_QWORD **)((v4 << 7) + v7 + 16) = 0i64;
**(_QWORD **)((Number << 7) + qword_140C4A418 + 16) = -1i64;
_InterlockedExchange((volatile __int32 *)((v4 << 7) + qword_140C4A418), 5);
if( *(_DWORD *)((v4 << 7) + qword_140C4A418) == 5 )
{
do
_mm_pause();
while( *(_DWORD *)(v5 + qword_140C4A418) == 5 );
}
LODWORD(v8) = HalpTscAdvSynchComputeMinimumDeltaAlternate((unsigned int)v4, a2);
LABEL_5:
v9 = v8;
while( *(_DWORD *)(v5 + qword_140C4A418) )
_mm_pause();
_InterlockedOr(v13, 0);
v10 = *(_QWORD *)(v5 + qword_140C4A418 + 8);
if( a3 )
*a3 = v9 + v10;
return(v10 - v9) / 2;
}Referenced by:
HalpTscAdjustToLeader
HalpTscAdjustToTarget
HalpTscAdvSynchCalculateRemoteDeltas
HalpTscAdvSynchToLeader
HalpTscAdvSynchToTarget