HalpCmciHandler
CHAR __stdcall HalpCmciHandler(){
KPCR *Pcr;
__int64 v1;
INT64 v2;
LARGE_INTEGER PerformanceCounter;
unsigned int v4;
unsigned __int8 CurrentIrql;
__int128 Src;
__int128 v8;
LOBYTE(Pcr) = HalpMcaWheaReady;
Src = 0i64;
v8 = 0i64;
if( !HalpMcaWheaReady )
return(char)Pcr;
Pcr = KeGetPcr();
v1 = *((_QWORD *)Pcr + 27);
if( !v1 )
return(char)Pcr;
while( 1 )
{
v2 = *(_QWORD *)(v1 + 164);
if( *(_QWORD *)(v1 + 16) )
{
if( *(_QWORD *)(v1 + 24) )
break;
}
LABEL_12:
v1 = *(_QWORD *)(v1 + 176);
if( !v1 )
return(char)Pcr;
}
PerformanceCounter = KeQueryPerformanceCounter(0i64);
++*(_DWORD *)(v1 + 116);
if( PerformanceCounter.QuadPart - *(_QWORD *)(v1 + 104) >= HalpCmciThresholdTime )
{
*(LARGE_INTEGER *)(v1 + 104) = PerformanceCounter;
v4 = 1;
*(_DWORD *)(v1 + 112) = 1;
}
else
{
v4 = ++*(_DWORD *)(v1 + 112);
}
if( v4 <= HalpCmciThresholdCount )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xEui64);
if( !*(_BYTE *)(v1 + 120) )
{
HalpCmciResetState(*(_QWORD *)(v1 + 24), v2);
KeInsertQueueDpc((PRKDPC)(v1 + 40), 0i64, 0i64);
}
LOBYTE(Pcr) = CurrentIrql;
__writecr8(CurrentIrql);
goto LABEL_12;
}
LODWORD(Pcr) = _InterlockedIncrement(&HalpCmciRevertToPolledMode);
if( (_DWORD)Pcr == 1 )
{
*(_QWORD *)&Src = 0x1674C6857i64;
*((_QWORD *)&Src + 1) = 0x100000020i64;
*(_QWORD *)&v8 = 0x80000003204C4148ui64;
*((_QWORD *)&v8 + 1) = 2i64;
WheaLogInternalEvent(&Src);
KeIpiGenericCall((PKIPI_BROADCAST_WORKER)HalpDisableCmciOnProcessor, 0i64);
LOBYTE(Pcr) = KeInsertQueueDpc((PRKDPC)(v1 + 40), 0i64, 0i64);
}
return(char)Pcr;
}Referenced by:
HalpInterruptDeferredErrorService