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.