HvlGetReferenceTimeUsingTscPage
VOID __fastcall HvlGetReferenceTimeUsingTscPage(CHAR a1, _BYTE *a2){
_DWORD *v2;
unsigned __int64 v3;
int v4;
_BYTE *v5;
v2 = (_DWORD *)a1;
v5 = 0i64;
while( 1 )
{
v3 = (unsigned __int64)HvlpReferenceTscPage;
v4 = *(_DWORD *)HvlpReferenceTscPage;
if( !*(_DWORD *)HvlpReferenceTscPage )
break;
if( KUSER_SHARED_DATA.ProcessorFeatures[32] )
{
__asm { rdtscp }
}
else
{
if( *((_BYTE *)KeGetCurrentPrcb() + 141) == 2 )
{
_mm_lfence();
}
else if( *((_BYTE *)KeGetCurrentPrcb() + 141) == 1 )
{
_mm_mfence();
}
v3 = __rdtsc();
LODWORD(a2) = HIDWORD(v3);
v3 = (unsigned int)v3;
a2 = (_BYTE *)(unsigned int)a2;
}
a2 = (_BYTE *)(*((_QWORD *)HvlpReferenceTscPage + 2)
+ (((v3 | ((_QWORD)a2 << 32)) * (unsigned __int128)*((unsigned __int64 *)HvlpReferenceTscPage + 1)) >> 64));
v5 = a2;
if( *(_DWORD *)HvlpReferenceTscPage == v4 )
goto LABEL_13;
}
HvlpGetRegister64(589828, &v5);
LABEL_13:
if( v2 )
*v2 = v4;
}Referenced by:
No references.