HalpCreateMcaProcessorErrorRecord

NTSTATUS __stdcall HalpCreateMcaProcessorErrorRecord(
        WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource,
        _WHEA_ERROR_PACKET_V2 *ErrorPacket,
        WHEA_ERROR_RECORD *ErrorRecord,
        PVOID Context){
  unsigned int v5; 
  NTSTATUS v8; 
  unsigned int v9; 
  _WHEA_PROCESSOR_GENERIC_ERROR_SECTION *v10; 
  unsigned int v11; 
  _WHEA_ERROR_PACKET_V2 *v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int64 v15; 
  _OWORD *v16; 
  _GUID NotifyType; 
  unsigned int Length; 
  unsigned int v20; 
  v5 = (unsigned int)Context;
  v8 = 0;
  memset((INT64)ErrorRecord, 0i64);
  v9 = 72 * *((_DWORD *)ErrorSource + 6) + 128;
  if( v9 > v5 )
    return -1073741789;
  WheaInitializeRecordHeader(&ErrorRecord->Header);
  ErrorRecord->Header.SectionCount = 4;
  v10 = (_WHEA_PROCESSOR_GENERIC_ERROR_SECTION *)((char *)ErrorRecord + v9);
  ErrorRecord->Header.Severity = ErrorPacket->ErrorSeverity;
  ErrorRecord->Header.Length = v5;
  v20 = v9;
  v11 = v9 + 192;
  ErrorRecord->Header.NotifyType = ErrorPacket->NotifyType;
  ErrorRecord->Header.Flags.AsULONG ^= (ErrorRecord->Header.Flags.AsULONG ^ (2 * ErrorPacket->Flags.AsULONG)) & 2;
  ErrorRecord->Header.Flags.AsULONG ^= (ErrorRecord->Header.Flags.AsULONG ^ (ErrorPacket->Flags.AsULONG >> 1)) & 4;
  if( v11 > v5 )
    return -1073741789;
  ((void(__fastcall *)(_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *, _WHEA_PROCESSOR_GENERIC_ERROR_SECTION *))off_140C006B8[0])(
    ErrorRecord->SectionDescriptor,
    v10);
  v12 = ErrorPacket + 1;
  HalpAddMcaToProcessorGenericSection((WHEA_XPF_MCA_SECTION *)&ErrorPacket[1], v10);
  ErrorRecord->SectionDescriptor[0].Flags.AsULONG |= 1u;
  ErrorRecord->SectionDescriptor[0].SectionOffset = v20;
  ErrorRecord->SectionDescriptor[0].SectionSeverity = ErrorPacket->ErrorSeverity;
  if( v11 + 65 > v5 )
    return -1073741789;
  HalpAddMcaToProcessorSpecificSection(
    (WHEA_XPF_MCA_SECTION *)&ErrorPacket[1],
    (_WHEA_XPF_PROCESSOR_ERROR_SECTION *)((char *)ErrorRecord + v11));
  ErrorRecord[1].Header.Signature = v11;
  *(_DWORD *)&ErrorRecord[1].Header.Revision.MinorRevision = 0;
  v13 = v11;
  HIWORD(ErrorRecord[1].Header.SignatureEnd) = 768;
  v14 = v11 + 272;
  *(GUID *)&ErrorRecord[1].Header.ValidBits.0 = XPF_PROCESSOR_ERROR_SECTION_GUID;
  ErrorRecord[1].Header.PartitionId.Data1 = ErrorPacket->ErrorSeverity;
  if( v14 > v5 )
    return -1073741789;
  v15 = 2i64;
  v16 = (_OWORD *)((char *)&ErrorRecord->Header.Signature + v13);
  do
  {
    *v16 = *(_OWORD *)&v12->Signature;
    v16[1] = *(_OWORD *)&v12->ErrorType;
    v16[2] = v12->NotifyType;
    v16[3] = *(_OWORD *)&v12->Context;
    v16[4] = *(_OWORD *)&v12->DataOffset;
    v16[5] = *(_OWORD *)&v12[1].Signature;
    v16[6] = *(_OWORD *)&v12[1].ErrorType;
    v16 += 8;
    NotifyType = v12[1].NotifyType;
    v12 = (_WHEA_ERROR_PACKET_V2 *)((char *)v12 + 128);
    *(v16 - 1) = NotifyType;
    --v15;
  }
  while( v15 );
  *v16 = *(_OWORD *)&v12->Signature;
  *(_DWORD *)ErrorRecord[1].Header.CreatorId.Data4 = v13;
  *(_DWORD *)&ErrorRecord[1].Header.CreatorId.Data4[4] = 272;
  LOWORD(ErrorRecord[1].Header.NotifyType.Data1) = 768;
  *(GUID *)ErrorRecord[1].Header.NotifyType.Data4 = XPF_MCA_SECTION_GUID;
  *(_DWORD *)&ErrorRecord[1].Header.Reserved[4] = ErrorPacket->ErrorSeverity;
  Length = ErrorPacket->Length;
  if( Length + v14 > v5 )
    return -1073741789;
  memmove((UINT8 *)ErrorRecord + v14, (UINT8 *)ErrorPacket, Length);
  ErrorRecord[1].SectionDescriptor[0].SectionType.Data1 = v14;
  *(_DWORD *)&ErrorRecord[1].SectionDescriptor[0].SectionType.Data2 = ErrorPacket->Length;
  *(_WORD *)ErrorRecord[1].SectionDescriptor[0].SectionType.Data4 = 768;
  ErrorRecord[1].SectionDescriptor[0].FRUId = WHEA_ERROR_PACKET_SECTION_GUID;
  *(_DWORD *)&ErrorRecord[1].SectionDescriptor[0].FRUText[12] = ErrorPacket->ErrorSeverity;
  return v8;
}

Referenced by:

HalpCreateMachineCheckErrorRecord