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