HalpTscAdvSynchTarget
INT64 __stdcall HalpTscAdvSynchTarget(){
unsigned int v0;
__int64 i;
int v2;
int v3;
int v4;
int v5;
int v6;
int v7;
INT64 v8;
int v9;
INT64 result;
int j;
signed __int32 v12[10];
v0 = *((_DWORD *)KeGetCurrentPrcb() + 9);
for( i = (__int64)(int)v0 << 7; ; *(_DWORD *)(i + TscRequest) = 0 )
{
while( 1 )
{
v2 = *(_DWORD *)(i + TscRequest);
if( v2 )
break;
_mm_pause();
}
v3 = v2 - 1;
if( !v3 )
{
_InterlockedOr(v12, 0);
HalpTscAdvSynchSkewCounter(*(_QWORD *)(i + TscRequest + 8));
goto LABEL_11;
}
v4 = v3 - 1;
if( !v4 )
{
_InterlockedOr(v12, 0);
for( j = *(_DWORD *)(i + TscRequest + 4); j; --j )
HalpTscAdvSynchSkewCounter(*(_QWORD *)(i + TscRequest + 8));
goto LABEL_11;
}
v5 = v4 - 1;
if( !v5 )
{
_InterlockedOr(v12, 0);
__writemsr(0x3Bu, *(_QWORD *)(i + TscRequest + 8) + __readmsr(0x3Bu));
goto LABEL_11;
}
v6 = v5 - 1;
if( !v6 )
{
_InterlockedOr(v12, 0);
*(_DWORD *)(i + TscRequest) = 6;
v8 = HalpTscAdvSynchComputeMinimumDelta(v0, (unsigned int)HalpTscRequestedIterations);
goto LABEL_10;
}
v7 = v6 - 1;
if( !v7 )
{
_InterlockedOr(v12, 0);
*(_DWORD *)(i + TscRequest) = 6;
v8 = HalpTscAdvSynchComputeMinimumDeltaAlternate(
*(unsigned int *)(i + TscRequest + 4),
(unsigned int)HalpTscRequestedIterations);
LABEL_10:
*(_QWORD *)(i + TscRequest + 8) = v8;
goto LABEL_11;
}
v9 = v7 - 2;
if( !v9 )
{
HalpProcessorFence();
v8 = __rdtsc();
goto LABEL_10;
}
if( v9 == 1 )
break;
LABEL_11:
_InterlockedOr(v12, 0);
}
_InterlockedOr(v12, 0);
result = TscRequest;
*(_DWORD *)(i + TscRequest) = 0;
return result;
}Referenced by:
HalpTscSynchronizationWorker