HalpTimerStallExecutionProcessor

NTSTATUS __fastcall HalpTimerStallExecutionProcessor(_KDPC *Dpc, VOID *a2, VOID *a3, VOID *a4){
  int DeferredContext; 
  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; 
  _GROUP_AFFINITY Affinity; 
  __int64 v26; 
  _GROUP_AFFINITY PreviousAffinity; 
  int v28; 

  DeferredContext = (int)Dpc[3].DeferredContext;
  v5 = 0;
  v6 = (char)a3;
  Affinity = 0i64;
  PreviousAffinity = 0i64;
  if( (DeferredContext & 1) != 0
    && (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) >= 2
    && KeGetCurrentIrql() < 2u
    && (v28 & 0x200) != 0
    && ((__int64)Dpc[2].DpcData & 0x20) == 0 )
  {
    v5 = 1;
    v23 = KiProcessorIndexToNumberMappingTable[KeGetPcr()->Prcb.Number];
    Affinity.Reserved[1] = 0;
    Affinity.Reserved[2] = 0;
    *(_DWORD *)&Affinity.Group = (unsigned __int16)(v23 >> 6);
    Affinity.Mask = 1i64 << (v23 & 0x3F);
    KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
  }
  HalpTimerGetInternalData(Dpc, a2, a3, a4);
  v10 = ((__int64(__fastcall *)(__int64))Dpc[1].SystemArgument2)(v9);
  v26 = v10;
  HalpProcessorFence();
  v13 = 1i64 << HIDWORD(Dpc[3].DeferredRoutine);
  v14 = v10;
  v15 = 0i64;
  v16 = 0;
  v17 = (_QWORD)a2 * *(_QWORD *)&Dpc[3].TargetInfoAsUlong + 9999999i64;
  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 * dword_140C4A490;
          dword_140C4A490 = v21;
        }
      }
      HalpTimerGetInternalData(Dpc, *((PVOID *)&v18 + 1), v11, v12);
      *(_QWORD *)&v18 = ((__int64(__fastcall *)(__int64))Dpc[1].SystemArgument2)(v22);
      if( (unsigned __int64)v18 < v14 )
        v15 += v13;
      v14 = v18;
    }
    while( (__int64)v18 + v15 - v26 < v19 );
  }
  if( v5 )
    LODWORD(v18) = (unsigned int)KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  return v18;
}

Referenced by:

HalpTimerMeasureFrequencies