HalpTimerStallExecutionProcessor

void __fastcall HalpTimerStallExecutionProcessor(__int64 a1, __int64 a2, void *a3, void *a4){
  int v4; 
  char v5; 
  char v6; 
  __int64 v9; 
  __int64 v10; 
  void *v11; 
  void *v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  unsigned __int128 v18; 
  unsigned __int64 v19; 
  unsigned int i; 
  int v21; 
  __int64 v22; 
  unsigned int v23; 
  struct _GROUP_AFFINITY Affinity; 
  __int64 v25; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  int v27; 
  v4 = *(_DWORD *)(a1 + 224);
  v5 = 0;
  v6 = (char)a3;
  Affinity = 0i64;
  PreviousAffinity = 0i64;
  if( (v4 & 1) != 0
    && (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) >= 2
    && KeGetCurrentIrql() < 2u
    && (v27 & 0x200) != 0
    && (*(_DWORD *)(a1 + 184) & 0x20) == 0 )
  {
    v5 = 1;
    v23 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)KeGetPcr() + 105)];
    Affinity.Reserved[1] = 0;
    Affinity.Reserved[2] = 0;
    *(_DWORD *)&Affinity.Group = (unsigned __int16)(v23 >> 6);
    Affinity.Mask = 1i64 << (v23 & 0x3F);
    KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
  }
  HalpTimerGetInternalData((KDPC *)a1, (PVOID)a2, a3, a4);
  v10 = (*(__int64(__fastcall **)(__int64))(a1 + 112))(v9);
  v25 = v10;
  HalpProcessorFence();
  v13 = 1i64 << *(_DWORD *)(a1 + 220);
  v14 = v10;
  v15 = 0i64;
  v16 = 0;
  v17 = a2 * *(_QWORD *)(a1 + 192) + 9999999;
  v18 = v17 * (unsigned __int128)0xD6BF94D5E57A42BDui64;
  v19 = v17 / 0x989680 + 1;
  if( v17 / 0x989680 != -1i64 )
  {
    do
    {
      if( v6 )
      {
        if( (++v16 & dword_140C4A13C) != 0 || !qword_140C4A140 )
          _mm_pause();
        else
          qword_140C4A140(v16, *((_QWORD *)&v18 + 1), v11);
      }
      else
      {
        for( i = 0; i < 0xC8; ++i )
        {
          _mm_pause();
          v21 = i * HalpGlobalVolatile;
          HalpGlobalVolatile = v21;
        }
      }
      HalpTimerGetInternalData((KDPC *)a1, *((PVOID *)&v18 + 1), v11, v12);
      *(_QWORD *)&v18 = (*(__int64(__fastcall **)(__int64))(a1 + 112))(v22);
      if( (unsigned __int64)v18 < v14 )
        v15 += v13;
      v14 = v18;
    }
    while( (__int64)v18 + v15 - v25 < v19 );
  }
  if( v5 )
    KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}

Referenced by:

HalpTimerMeasureFrequencies