HalpInterruptEnablePerformanceEvents
VOID __stdcall HalpInterruptEnablePerformanceEvents(UINT64 Context){
INT64 v1;
unsigned __int8 v2;
bool v4;
int v5;
unsigned int v6;
ULONG_PTR v7;
unsigned int v8;
char v9;
unsigned __int64 v10;
unsigned int v11;
__int128 v12;
__int64 v13;
__int128 v14[3];
__int64 v15;
__int64 v16;
int v17;
int v18;
v1 = HalpInterruptController;
v16 = 0i64;
v2 = 0;
v15 = 0i64;
v4 = *(_DWORD *)(HalpInterruptController + 216) == 2;
memset(v14, 0, sizeof(v14));
if( v4 )
{
LODWORD(v16) = *(_DWORD *)(HalpInterruptController + 232);
HIDWORD(v16) = -3;
if( !HalpInterruptPerfLinesFound )
{
if( !HalpInterruptFindLines((int *)&v16) )
return;
HalpInterruptPerfLinesFound = 1;
}
*(_QWORD *)&v14[1] = 0x1FFFFFFFFi64;
memset((char *)&v14[1] + 12, 0, 20);
*(_QWORD *)&v14[0] = 1i64;
*((_QWORD *)&v14[0] + 1) = 0x1000000001i64;
DWORD2(v14[1]) = 3;
LODWORD(v15) = 254;
HIDWORD(v15) = HalpInterruptGetPriority(v1, 0xFEu);
if( !Context )
v2 = HalpAcquireHighLevelLock(&HalpInterruptLock);
HalpInterruptSetLineStateInternal(v1, (__int64)&v16, (__int64)v14);
if( !Context )
{
KxReleaseSpinLock(&HalpInterruptLock);
__writecr8(v2);
}
}
v5 = *(_DWORD *)(v1 + 216);
if( ((v5 - 3) & 0xFFFFFFFC) == 0 && v5 != 5 )
{
v6 = *((_DWORD *)KeGetPcr() + 105);
v7 = HalpInterruptProcessorState + ((unsigned __int64)v6 << 6);
v8 = *(_DWORD *)(v7 + 40);
if( v8 )
{
if( (int)HalpInterruptGsiToLine(v8, &v16) >= 0 )
{
v17 = -1;
v9 = *(_BYTE *)(v7 + 14);
v12 = 0i64;
LODWORD(v12) = 6;
DWORD2(v12) = v6;
v13 = 0i64;
v18 = 1;
v10 = (unsigned __int8)HalpAcquireHighLevelLock(&HalpInterruptLock);
HalpInterruptSetLineState(&v16, 0xFEu, 15, v9 != 0, 1, (__int64)&v12, (__int64)&v17, v11);
KxReleaseSpinLock(&HalpInterruptLock);
__writecr8(v10);
}
}
}
}Referenced by:
EmonPreOverflowHandler
HalpDpPostReplaceInitialization
HalpPostSleepMP