WheaReportHwError
NTSTATUS __stdcall WheaReportHwError(_WHEA_ERROR_PACKET_V2 *ErrPkt){
NTSTATUS v1;
int ErrorSeverity;
char v4;
__int64 v6;
INT64 v7;
INT64 *ErrorSource;
unsigned int v9;
INT64 v10;
INT64 v11;
ULONG_PTR v12;
_WHEA_ERROR_SEVERITY v13;
INT64 enabled;
char v15;
char v16[12];
__int128 Src;
__int128 v18;
_WHEA_ERROR_PACKET_V2 *v19;
int v20[10];
v1 = 0;
v19 = 0i64;
memset(v16, 0, sizeof(v16));
v15 = 0;
ErrorSeverity = ErrPkt->ErrorSeverity;
v4 = 0;
Src = 0i64;
v18 = 0i64;
if( (ErrorSeverity & 0xC0000000) == -1073741824 )
return -1073741811;
if( (ErrorSeverity & 0x40000000) != 0 )
{
v15 = 1;
ErrorSeverity &= ~0x40000000u;
*(_QWORD *)&v16[4] = ((unsigned __int64)&ErrPkt->Version + ErrPkt->Length + 3) & 0xFFFFFFFFFFFFFFF8ui64;
LABEL_7:
ErrPkt->ErrorSeverity = ErrorSeverity;
goto LABEL_8;
}
if( ErrorSeverity < 0 )
{
ErrorSeverity &= ~0x80000000;
v4 = 1;
goto LABEL_7;
}
LABEL_8:
if( ErrorSeverity == 3 && !v4 )
return 0;
LODWORD(enabled) = 1;
wil_details_FeatureReporting_ReportUsageToService(
&Feature_LogErrorRecords__private_reporting,
0x11B4117ui64,
0i64,
0i64,
(FEATURE_LOGGED_TRAITS *)&Feature_LogErrorRecords_logged_traits,
enabled);
if( !v4 && ErrPkt->ErrorSeverity != WheaErrSevCorrected && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
{
*(_QWORD *)&Src = 0x1674C6857i64;
*((_QWORD *)&Src + 1) = 40i64;
*(_QWORD *)&v18 = 0x800000054C4E524Bui64;
*((_QWORD *)&v18 + 1) = 0x800000008i64;
v19 = ErrPkt;
WheaLogInternalEvent(&Src);
}
v6 = *((_QWORD *)KeGetPcr() + 4244);
if( !v6 || (v7 = *(_QWORD *)(v6 + 8)) == 0 || !*(_DWORD *)(v7 + 4) )
{
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
KeBugCheckEx(0x124u, ErrPkt->ErrorSourceType, 0i64, 0i64, 0i64);
return 0;
}
ErrorSource = WheapGetErrorSource(v7, ErrPkt->ErrorSourceId);
v10 = (INT64)ErrorSource;
if( !ErrorSource )
{
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
KeBugCheckEx(0x122u, 9ui64, ErrPkt->ErrorSourceType, v9, 0i64);
return -1073741632;
}
_InterlockedAdd((volatile signed __int32 *)ErrorSource + 6, 1u);
if( ErrPkt->ErrorSeverity == WheaErrSevCorrected && WheapApplyThresholdChecks((INT64)ErrorSource) )
{
v20[8] = ErrPkt->ErrorSourceType;
v20[9] = ErrPkt->ErrorSourceId;
v20[0] = 1733060695;
v20[1] = 1;
v20[2] = 40;
v20[3] = 1;
v20[5] = -2147483644;
v20[4] = 1280201291;
v20[6] = 2;
v20[7] = 8;
WheaLogInternalEvent(v20);
return 0;
}
v11 = WheapAllocErrorRecord(v10, (UINT64 *)v16);
v12 = v11;
if( !v11 )
{
++*(_DWORD *)(v10 + 16);
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 && !v4 )
KeBugCheckEx(0x122u, 0xAui64, ErrPkt->ErrorSourceType, ErrPkt->ErrorSourceId, 0i64);
return -1073741670;
}
*(_DWORD *)(v11 + 24) ^= (*(_DWORD *)(v11 + 24) ^ (ErrPkt->Flags.AsULONG >> 2)) & 4;
*(_DWORD *)(v11 + 24) ^= ((unsigned __int8)*(_DWORD *)(v11 + 24) ^ (unsigned __int8)(ErrPkt->Flags.AsULONG >> 2)) & 8;
*(_DWORD *)v16 = WheapFillOutErrorRecord((unsigned int)(*(_DWORD *)v16 - 40), (INT64)ErrPkt, v10, v11 + 40);
if( *(int *)v16 >= 0 )
{
if( v4 || v15 )
*(_DWORD *)(v12 + 144) |= 8u;
if( (*(_DWORD *)(v12 + 144) & 2) != 0 )
{
WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
goto LABEL_43;
}
if( !WheapPolicyIgnoreDummyWrite && !v4 )
{
WheapCompressErrorRecord(0i64, (WHEA_ERROR_RECORD *)(v12 + 40));
if( (int)PshedWriteErrorRecord(1i64, *(unsigned int *)(v12 + 60), v12 + 40) < 0 )
WheapPolicyIgnoreDummyWrite = 1;
}
v13 = ErrPkt->ErrorSeverity;
if( v13 == WheaErrSevFatal )
{
if( !v4 )
{
PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
WheapPersistPageForMemoryError(v12 + 40);
WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
PshedWriteErrorRecord(0i64, *(unsigned int *)(v12 + 60), v12 + 40);
WheapAddToDumpFile((PVOID)(v12 + 40), *(unsigned int *)(v12 + 60));
if( v15 )
KeBugCheckEx(
0x124u,
*(int *)(v10 + 104),
v12 + 40,
*(_QWORD *)(*(_QWORD *)&v16[4] + 72i64),
*(_QWORD *)(*(_QWORD *)&v16[4] + 80i64));
goto LABEL_60;
}
}
else if( (unsigned int)(v13 - 2) > 1 )
{
if( v13 )
{
WheapFreeErrorRecord(v12);
return -1073741811;
}
PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
WheapAttemptErrorRecovery((WHEA_ERROR_RECORD *)(v12 + 40));
WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
if( *(_DWORD *)(v12 + 52) == 2 )
{
*(_DWORD *)(v12 + 144) |= 1u;
}
else if( !v4 )
{
WheapPersistPageForMemoryError(v12 + 40);
PshedWriteErrorRecord(0i64, *(unsigned int *)(v12 + 60), v12 + 40);
WheapAddToDumpFile((PVOID)(v12 + 40), *(unsigned int *)(v12 + 60));
LABEL_60:
PshedBugCheckSystem(v10 + 96, v12 + 40);
return v1;
}
LABEL_43:
if( (*(_DWORD *)(v12 + 24) & 1) != 0 )
{
if( WheapEventingInitialized == 1 )
WheapGenerateETWEvents((WHEA_ERROR_RECORD *)(v12 + 40));
WheapFreeErrorRecord(v12);
return v1;
}
goto LABEL_64;
}
PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
LABEL_64:
WheapWorkQueueAddItem(*(_QWORD *)(v6 + 16), (LIST_ENTRY *)v12);
return v1;
}
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 && !v4 )
KeBugCheckEx(0x122u, 0xBui64, ErrPkt->ErrorSourceType, ErrPkt->ErrorSourceId, 0i64);
WheapFreeErrorRecord(v12);
return *(_DWORD *)v16;
}Referenced by:
HalHandleNMI
HalpCheckAndReportGhes
HalpMcaReportError
WheaHwErrorReportSubmitDeviceDriver