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