HalpCmcWorkerRoutine
VOID __fastcall HalpCmcWorkerRoutine(INT64 a1){
INT64 v1;
unsigned int v2;
unsigned int ActiveProcessorCount;
unsigned int v4;
int *v5;
unsigned int v6;
unsigned int v7;
struct _GROUP_AFFINITY *p_PreviousAffinity;
INT64 v9;
unsigned int v10;
unsigned int v11;
PVOID v12;
unsigned int v13;
bool v14;
struct _GROUP_AFFINITY Affinity;
INT64 v16;
__int128 Src;
__int128 v18;
__int128 v19;
struct _GROUP_AFFINITY PreviousAffinity;
++*(_DWORD *)(a1 + 184);
v1 = a1;
v16 = a1;
v2 = 0;
Affinity = 0i64;
PreviousAffinity = 0i64;
Src = 0i64;
v18 = 0i64;
v19 = 0i64;
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
v4 = 0;
if( ActiveProcessorCount )
{
v5 = KiProcessorIndexToNumberMappingTable;
v6 = ActiveProcessorCount;
do
{
v7 = *v5;
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v7 >> 6);
Affinity.Mask = 1i64 << (v7 & 0x3F);
if( v4 )
p_PreviousAffinity = 0i64;
else
p_PreviousAffinity = &PreviousAffinity;
KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
v9 = *((_QWORD *)KeGetPcr() + 27);
while( v9 )
{
v10 = v2;
HalpCmcPollProcessor(HalpCmcErrorPacket, HalpCmciEnabled, *(_QWORD *)(v9 + 164), v9);
v2 = *(_DWORD *)(v9 + 156);
v9 = *(_QWORD *)(v9 + 176);
if( v2 <= v10 )
v2 = v10;
}
++v4;
++v5;
}
while( v4 < v6 );
v1 = v16;
}
if( HalpCmciRevertToPolledMode )
{
if( *(_BYTE *)(v1 + 172) )
{
if( *(_DWORD *)(v1 + 184) > 1u )
{
v11 = *(_DWORD *)(v1 + 188);
if( v11 < *(_DWORD *)(v1 + 180) && v2 < *(_DWORD *)(v1 + 176) )
{
*(_DWORD *)(v1 + 188) = v11 + 1;
KeCancelTimer((PKTIMER)(v1 + 8));
v12 = HalpCmcErrorSource;
HalpCmciRevertToPolledMode = 0;
HalpCmcPollingStarted = 0;
*((_BYTE *)HalpCmcErrorSource + 48) = 5;
HalpCmciInit((INT64)v12);
v13 = *(_DWORD *)(v1 + 180);
v14 = *(_DWORD *)(v1 + 188) < v13;
LODWORD(v19) = *(_DWORD *)(v1 + 188);
*(_DWORD *)(v1 + 184) = 0;
*(_QWORD *)&Src = 0x1674C6857i64;
DWORD1(v18) = -v14 - 2147483620;
HIDWORD(v19) = *(_DWORD *)(v1 + 176);
*((_QWORD *)&Src + 1) = 48i64;
LODWORD(v18) = 541868360;
*((_QWORD *)&v18 + 1) = 0x1000000002i64;
*(_QWORD *)((char *)&v19 + 4) = __PAIR64__(v2, v13);
WheaLogInternalEvent(&Src);
}
}
}
}
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
_InterlockedExchange((volatile __int32 *)(v1 + 168), 0);
}Referenced by:
No references.