HalpCreateMachineCheckErrorRecord
NTSTATUS __stdcall HalpCreateMachineCheckErrorRecord(
_WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource,
_WHEA_ERROR_PACKET_V2 *ErrorPacket,
_WHEA_ERROR_RECORD *ErrorRecord,
PVOID Context){
INT16 v4;
unsigned int v5;
char v9;
unsigned int v10;
unsigned int Version;
NTSTATUS McaMemoryErrorRecord;
NTSTATUS v13;
VOID *v15;
_GROUP_AFFINITY Affinity;
_GROUP_AFFINITY PreviousAffinity;
v4 = *(_WORD *)ErrorPacket[1].NotifyType.Data4;
v5 = (unsigned int)Context;
Affinity = 0i64;
PreviousAffinity = 0i64;
v9 = 0;
if( KeGetCurrentIrql() < 2u )
{
v10 = KiProcessorIndexToNumberMappingTable[ErrorPacket[1].ErrorType];
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v10 >> 6);
Affinity.Mask = 1i64 << (v10 & 0x3F);
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
v9 = 1;
}
Version = ErrorPacket[1].Version;
if( Version != 1 )
{
if( Version != 2 || !HalpMcaAMDIsMemoryError((INT64)&ErrorPacket[1], v4) )
goto LABEL_8;
LABEL_18:
McaMemoryErrorRecord = HalpCreateMcaMemoryErrorRecord(ErrorSource, ErrorPacket, ErrorRecord, (VOID *)v5, v15);
goto LABEL_9;
}
if( (v4 & 0xEF80) == 128 || (v4 & 0xEF00) == 256 && (v4 & 3) == 2 && (unsigned __int8)v4 >> 4 == 7 )
goto LABEL_18;
LABEL_8:
McaMemoryErrorRecord = HalpCreateMcaProcessorErrorRecord(ErrorSource, ErrorPacket, ErrorRecord, (VOID *)v5, v15);
LABEL_9:
v13 = McaMemoryErrorRecord;
if( McaMemoryErrorRecord >= 0
&& (*(_QWORD *)ErrorPacket[1].NotifyType.Data4 & 0x2000000000000000i64) != 0
&& ErrorRecord->Header.Severity == WheaErrSevCorrected )
{
ErrorRecord->Header.Flags.AsULONG |= 1u;
}
if( v9 )
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
return v13;
}Referenced by:
HalpCreateErrorRecord