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