EmonAllocateCounter
NTSTATUS __stdcall EmonAllocateCounter(INT64 a1, INT64 a2, INT64 a3, INT64 *a4){
int v5;
int v7;
NTSTATUS HalCounters;
__int64 v9;
int v10;
__int64 v11;
int v12;
int v13;
unsigned __int64 v14;
__int64 v15;
_DWORD *v16;
NTSTATUS result;
v5 = a3;
v7 = a1;
HalCounters = HalpAllocateHalCounters();
v10 = 0;
if( HalCounters < 0 )
return -2147483631;
v11 = *(&CmpDummyThreadEvent + 620) + 16i64 * *(&CmpDummyThreadEvent + 1217) * KeGetPcr()->Prcb.Number;
if( !v9 || !*(_BYTE *)(v9 + 220) )
{
v13 = *(&CmpDummyThreadEvent + 1223) - 1;
v15 = *(&CmpDummyThreadEvent + 1223) - 1;
if( *(&CmpDummyThreadEvent + 1223) - 1 >= 0 )
{
v16 = (_DWORD *)(v11 + 16i64 * v13);
while( *v16 != 3 || (__readmsr(v13 + 390) & 0x4000FF) != 0 )
{
--v13;
v16 -= 4;
if( --v15 < 0 )
goto LABEL_13;
}
goto LABEL_6;
}
goto LABEL_13;
}
v12 = *(unsigned __int8 *)(v9 + 212);
v13 = v12 + *(&CmpDummyThreadEvent + 1223);
if( *(_DWORD *)(v11 + 16i64 * (unsigned int)(v12 + *(&CmpDummyThreadEvent + 1223))) != 3
|| (v14 = __readmsr(0x38Fu), _bittest64((const __int64 *)&v14, (unsigned __int8)(v12 + 32))) )
{
LABEL_13:
_InterlockedExchangeAdd((_DWORD *)&stru_140CF2E80 + 1614, 0xFFFFFFFE);
return -2147483631;
}
LABEL_6:
*(_DWORD *)(v11 + 16i64 * v13) = v7;
if( v7 == 2 )
{
*(_QWORD *)(v11 + 16i64 * v13 + 4) = 24i64;
}
else
{
*(_DWORD *)(v11 + 16i64 * v13 + 4) = v5;
*(_DWORD *)(v11 + 16i64 * v13 + 8) = *(_DWORD *)(a2 + 24);
v10 = *(_DWORD *)(a2 + 208);
}
*(_DWORD *)(v11 + 16i64 * v13 + 12) = v10;
result = 0;
*(_DWORD *)a4 = v13;
return result;
}Referenced by:
EmonEnableMonitoring