EmonMarkCountersReserved
INT64 __fastcall EmonMarkCountersReserved(INT64 a1, UINT64 a2){
unsigned int v2;
unsigned __int64 v4;
unsigned int v5;
__int64 v6;
unsigned __int8 CurrentIrql;
bool i;
__int64 v9;
unsigned int v10;
char v11;
unsigned __int64 v12;
char v13;
__int64 v14;
struct _GROUP_AFFINITY Affinity;
struct _GROUP_AFFINITY PreviousAffinity;
v2 = 0;
v4 = a2;
Affinity = 0i64;
v5 = KiProcessorIndexToNumberMappingTable[(unsigned int)a1];
Affinity.Group = v5 >> 6;
v6 = EmonCounterStatus + 16i64 * (unsigned int)(a1 * EmonNumberCounters);
Affinity.Mask = 1i64 << (v5 & 0x3F);
PreviousAffinity = 0i64;
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
for( i = !_BitScanForward64((unsigned __int64 *)&v9, a2); !i; i = !_BitScanForward64((unsigned __int64 *)&v9, v4) )
{
v10 = EmonNumberArchCounters;
v11 = v9;
if( (unsigned int)v9 >= EmonNumberArchCounters )
LODWORD(v9) = v9 + EmonNumberArchCounters - 32;
if( *(_DWORD *)(v6 + 16i64 * (unsigned int)v9) != 3 )
{
v12 = v4 ^ a2;
v2 = -1073741670;
if( v12 )
{
while( 1 )
{
i = !_BitScanForward64((unsigned __int64 *)&v14, v12);
if( i )
break;
v13 = v14;
if( (unsigned int)v14 >= v10 )
v14 = (unsigned int)v14 + v10 - 32;
v12 ^= 1i64 << v13;
*(_DWORD *)(v6 + 16 * v14) = 3;
}
}
break;
}
v4 ^= 1i64 << v11;
*(_DWORD *)(v6 + 16i64 * (unsigned int)v9) = 2;
}
__writecr8(CurrentIrql);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
return v2;
}Referenced by:
EmonAllocateResources