Amd64AllocateCounter
INT64 __fastcall Amd64AllocateCounter(INT64 a1, _DWORD *a2, _DWORD *a3){
int v5;
int HalCounters;
int v7;
int v8;
__int64 v9;
unsigned __int64 v10;
_DWORD *i;
INT64 result;
v5 = a1;
HalCounters = HalpAllocateHalCounters();
v7 = 0;
if( HalCounters < 0 )
return 2147483665i64;
v8 = 0;
v9 = 0i64;
v10 = Amd64CounterStatus + ((unsigned __int64)*((unsigned int *)KeGetPcr() + 105) << 6);
for( i = (_DWORD *)v10; *i != 3 || (__readmsr(v8 - 1073676288) & 0x4000FF) != 0; i += 4 )
{
++v8;
if( ++v9 >= 4 )
{
_InterlockedExchangeAdd(&HalpPmuInUse, 0xFFFFFFFE);
return 2147483665i64;
}
}
*(_DWORD *)(v10 + 16i64 * v8) = v5;
if( v5 == 2 )
{
*(_QWORD *)(v10 + 16i64 * v8 + 4) = 24i64;
}
else
{
*(_DWORD *)(v10 + 16i64 * v8 + 4) = *a2;
*(_DWORD *)(v10 + 16i64 * v8 + 8) = a2[6];
v7 = a2[52];
}
*(_DWORD *)(v10 + 16i64 * v8 + 12) = v7;
result = 0i64;
*a3 = v8;
return result;
}Referenced by:
Amd64EnableMonitoring