WheaReportHwError
NTSTATUS __stdcall WheaReportHwError(_WHEA_ERROR_PACKET_V2 *ErrPkt){
NTSTATUS v1;
int ErrorSeverity;
char v4;
INT64 v6;
UINT64 v7;
void *WheaInfo;
__int64 v9;
_WHEAP_ERROR_SOURCE *ErrorSource;
_WHEA_ERROR_PACKET_V2 *v11;
INT64 v12;
_WHEAP_ERROR_RECORD_WRAPPER *v13;
_WHEAP_ERROR_RECORD_WRAPPER *v14;
_WHEA_ERROR_SEVERITY v15;
INT64 enabled;
char v17;
char RecordLength[12];
__int128 Src;
__int128 v20;
_WHEA_ERROR_PACKET_V2 *v21;
int v22[10];
v1 = 0;
v21 = 0i64;
memset(RecordLength, 0, sizeof(RecordLength));
v17 = 0;
ErrorSeverity = ErrPkt->ErrorSeverity;
v4 = 0;
Src = 0i64;
v20 = 0i64;
if( (ErrorSeverity & 0xC0000000) == -1073741824 )
return -1073741811;
if( (ErrorSeverity & 0x40000000) != 0 )
{
v17 = 1;
ErrorSeverity &= ~0x40000000u;
*(_QWORD *)&RecordLength[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(
(wil_details_FeatureReportingCache *)&stru_140CF2E80 + 826,
0x11B4117ui64,
0i64,
0i64,
(FEATURE_LOGGED_TRAITS *)&Feature_LogErrorRecords_logged_traits,
enabled);
if( !v4 && ErrPkt->ErrorSeverity != WheaErrSevCorrected && (ErrPkt->Flags._bf_0 & 1) == 0 )
{
*(_QWORD *)&Src = 0x1674C6857i64;
*((_QWORD *)&Src + 1) = 40i64;
*(_QWORD *)&v20 = 0x800000054C4E524Bui64;
*((_QWORD *)&v20 + 1) = 0x800000008i64;
v21 = ErrPkt;
WheaLogInternalEvent(&Src);
}
WheaInfo = KeGetPcr()->Prcb.WheaInfo;
if( !WheaInfo || (v9 = *((_QWORD *)WheaInfo + 1)) == 0 || !*(_DWORD *)(v9 + 4) )
{
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 )
KeBugCheckEx(0x124u, (PVOID)(int)ErrPkt->ErrorSourceType, 0i64, 0i64, 0i64);
return 0;
}
ErrorSource = WheapGetErrorSource((_WHEAP_ERROR_SOURCE_TABLE *)v9, ErrPkt->ErrorSourceId, v6, v7);
v12 = (INT64)ErrorSource;
if( !ErrorSource )
{
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 )
KeBugCheckEx(0x122u, (PVOID)9, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)(unsigned int)v11, 0i64);
return -1073741632;
}
_InterlockedAdd(&ErrorSource->ErrorCount, 1u);
if( ErrPkt->ErrorSeverity == WheaErrSevCorrected && (unsigned __int8)WheapApplyThresholdChecks(ErrorSource, v11) )
{
v22[8] = ErrPkt->ErrorSourceType;
v22[9] = ErrPkt->ErrorSourceId;
v22[0] = 1733060695;
v22[1] = 1;
v22[2] = 40;
v22[3] = 1;
v22[5] = -2147483644;
v22[4] = 1280201291;
v22[6] = 2;
v22[7] = 8;
WheaLogInternalEvent(v22);
return 0;
}
v13 = WheapAllocErrorRecord((_WHEAP_ERROR_SOURCE *)v12, (UINT64 *)RecordLength);
v14 = v13;
if( !v13 )
{
++*(_DWORD *)(v12 + 16);
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 && !v4 )
KeBugCheckEx(0x122u, (PVOID)0xA, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)ErrPkt->ErrorSourceId, 0i64);
return -1073741670;
}
v13->Flags.AsULONG ^= (v13->Flags.AsULONG ^ ((unsigned __int32)ErrPkt->Flags._bf_0 >> 2)) & 4;
v13->Flags.AsULONG ^= ((unsigned __int8)v13->Flags.AsULONG ^ (unsigned __int8)((unsigned __int32)ErrPkt->Flags._bf_0 >> 2)) & 8;
*(_DWORD *)RecordLength = WheapFillOutErrorRecord(
(unsigned int)(*(_DWORD *)RecordLength - 40),
(INT64)ErrPkt,
v12,
(INT64)&v13->ErrorRecord);
if( *(int *)RecordLength >= 0 )
{
if( v4 || v17 )
v14->ErrorRecord.Header.Flags.AsULONG |= 8u;
if( (v14->ErrorRecord.Header.Flags.AsULONG & 2) != 0 )
{
WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
goto LABEL_43;
}
if( !WheapPolicyIgnoreDummyWrite && !v4 )
{
WheapCompressErrorRecord(0i64, &v14->ErrorRecord);
if( (int)PshedWriteErrorRecord(1i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord) < 0 )
WheapPolicyIgnoreDummyWrite = 1;
}
v15 = ErrPkt->ErrorSeverity;
if( v15 == WheaErrSevFatal )
{
if( !v4 )
{
PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
WheapPersistPageForMemoryError((INT64)&v14->ErrorRecord);
WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
PshedWriteErrorRecord(0i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord);
WheapAddToDumpFile(&v14->ErrorRecord, v14->ErrorRecord.Header.Length);
if( v17 )
KeBugCheckEx(
0x124u,
(PVOID)*(int *)(v12 + 104),
&v14->ErrorRecord,
*(PVOID *)(*(_QWORD *)&RecordLength[4] + 72i64),
*(PVOID *)(*(_QWORD *)&RecordLength[4] + 80i64));
goto LABEL_60;
}
}
else if( (unsigned int)(v15 - 2) > 1 )
{
if( v15 )
{
WheapFreeErrorRecord(v14);
return -1073741811;
}
PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
WheapAttemptErrorRecovery(&v14->ErrorRecord);
WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
if( v14->ErrorRecord.Header.Severity == WheaErrSevCorrected )
{
v14->ErrorRecord.Header.Flags.AsULONG |= 1u;
}
else if( !v4 )
{
WheapPersistPageForMemoryError((INT64)&v14->ErrorRecord);
PshedWriteErrorRecord(0i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord);
WheapAddToDumpFile(&v14->ErrorRecord, v14->ErrorRecord.Header.Length);
LABEL_60:
PshedBugCheckSystem(v12 + 96, &v14->ErrorRecord);
return v1;
}
LABEL_43:
if( (v14->Flags.AsULONG & 1) != 0 )
{
if( *(&WheapDeferredInternalLogsEventLock + 6) == 1 )
WheapGenerateETWEvents(&v14->ErrorRecord);
WheapFreeErrorRecord(v14);
return v1;
}
goto LABEL_64;
}
PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
LABEL_64:
WheapWorkQueueAddItem(*((_WHEAP_WORK_QUEUE **)WheaInfo + 2), &v14->WorkEntry);
return v1;
}
if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 && !v4 )
KeBugCheckEx(0x122u, (PVOID)0xB, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)ErrPkt->ErrorSourceId, 0i64);
WheapFreeErrorRecord(v14);
return *(_DWORD *)RecordLength;
}Referenced by:
HalHandleNMI
HalpCheckAndReportGhes
HalpMcaReportError
WheaHwErrorReportSubmitDeviceDriver