HalpMceHandlerCore
CHAR __fastcall HalpMceHandlerCore(INT64 a1, CHAR a2, INT64 a3){
CHAR v6;
unsigned int v7;
INT64 v8;
__int64 v9;
_QWORD *McaPcrContext;
__int64 *v11;
int v12;
INT64 v14;
LODWORD(v14) = 0;
v6 = 0;
v7 = ((__int64(__fastcall *)(INT64, __int64, _QWORD))HalpWheaReadMsr)(a3, 378i64, 0i64);
if( !a2 || (v8 = v7, LOBYTE(v8) = v7 & 3, (v7 & 3) != 1) && (v7 & 4) != 0 )
{
v9 = 0i64;
if( !HalpMcaWheaReady
|| (McaPcrContext = (_QWORD *)HalpGetMcaPcrContext(a3)) == 0i64
|| (v9 = *McaPcrContext, v11 = (__int64 *)(*McaPcrContext + 80i64), !*McaPcrContext) )
{
v11 = HalpMceBackupErrorBuffer;
}
while( (int)HalpMcaReadErrorPresence(v8, a3) >= 0 )
{
while( !KxTryToAcquireSpinLock((volatile INT32 *)&HalpMceLock) )
_mm_pause();
if( (int)HalpMcaReadError(16i64, (INT64)v11, &v14, a1, a3) < 0 )
{
KxReleaseSpinLock(&HalpMceLock);
return v6;
}
if( v9 )
{
v12 = v14;
*(_DWORD *)(v9 + 12) = 0;
*(_DWORD *)(v9 + 20) = v12;
}
HalpProcessorInMceHandler = *((_DWORD *)KeGetPcr() + 105);
HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v9, (INT64)v11, a3);
HalpProcessorInMceHandler = 1280;
HalpMcaClearError((INT64)v11, a3);
if( McaWmiCallback )
LOBYTE(HalpClockWorkUnion) = 1;
KxReleaseSpinLock(&HalpMceLock);
v6 = 1;
}
}
return v6;
}Referenced by:
HalpMceHandler