HalpCreateMcaMemoryErrorRecord

NTSTATUS __stdcall HalpCreateMcaMemoryErrorRecord(
        _WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource,
        _WHEA_ERROR_PACKET_V2 *ErrorPacket,
        _WHEA_ERROR_RECORD *ErrorRecord,
        VOID *Context,
        VOID *Contexta){
  unsigned int v6; 
  NTSTATUS v9; 
  unsigned int v10; 
  unsigned __int32 v11; 
  unsigned __int32 v12; 
  _WHEA_ERROR_RECORD_HEADER_FLAGS v13; 
  unsigned int v14; 
  _WHEA_ERROR_PACKET_V2 *v15; 
  _WHEA_ERROR_PACKET_V2 *v16; 
  unsigned int v17; 
  unsigned int v18; 
  _OWORD *v19; 
  __int64 v20; 
  _GUID NotifyType; 
  unsigned int Length; 

  v6 = (unsigned int)Context;
  v9 = 0;
  memset(ErrorRecord, 0i64, (size_t)Context);
  v10 = 72 * ErrorSource->MaxSectionsPerRecord + 128;
  if( v10 > v6 )
    return -1073741789;
  WheaInitializeRecordHeader(&ErrorRecord->Header);
  ErrorRecord->Header.SectionCount = 4;
  ErrorRecord->Header.Severity = ErrorPacket->ErrorSeverity;
  ErrorRecord->Header.Length = v6;
  ErrorRecord->Header.NotifyType = ErrorPacket->NotifyType;
  v11 = ErrorRecord->Header.Flags.AsULONG ^ (ErrorRecord->Header.Flags.AsULONG ^ (2 * ErrorPacket->Flags._bf_0)) & 2;
  ErrorRecord->Header.Flags.AsULONG = v11;
  v12 = (v11 ^ ((unsigned __int32)ErrorPacket->Flags._bf_0 >> 1)) & 4 ^ v11;
  ErrorRecord->Header.Flags.AsULONG = v12;
  v13.AsULONG = (ErrorPacket->Flags._bf_0 & 0xC0) == 64 ? v12 & 0xFFFFFFDF : v12 | 0x20;
  v14 = v10 + 80;
  ErrorRecord->Header.Flags = v13;
  if( v10 + 80 > v6 )
    return -1073741789;
  v15 = ErrorPacket + 1;
  v16 = ErrorPacket + 1;
  if( *(&stru_140CF2E80 + 7434) )
    HalpAddMcaExtendedLogToMemoryErrorSection(
      (INT64)v16,
      (INT64)ErrorRecord->SectionDescriptor,
      (unsigned int *)((char *)&ErrorRecord->Header.Signature + v10));
  else
    HalpAddMcaToMemoryErrorSection((__int64)v16, (unsigned int *)((char *)&ErrorRecord->Header.Signature + v10));
  ErrorRecord->SectionDescriptor[0].Flags.AsULONG |= 1u;
  ErrorRecord->SectionDescriptor[0].SectionOffset = v10;
  ErrorRecord->SectionDescriptor[0].Revision.AsUSHORT = 768;
  ErrorRecord->SectionDescriptor[0].SectionLength = 80;
  ErrorRecord->SectionDescriptor[0].SectionType = MEMORY_ERROR_SECTION_GUID;
  ErrorRecord->SectionDescriptor[0].SectionSeverity = ErrorPacket->ErrorSeverity;
  if( v10 + 272 > v6 )
    return -1073741789;
  ((void(__fastcall *)(_WHEA_ERROR_RECORD *, char *))off_140C006B8[0])(&ErrorRecord[1], (char *)ErrorRecord + v14);
  HalpAddMcaToProcessorGenericSection(
    (_WHEA_XPF_MCA_SECTION *)&ErrorPacket[1],
    (_WHEA_PROCESSOR_GENERIC_ERROR_SECTION *)((char *)ErrorRecord + v14));
  ErrorRecord[1].Header.Signature = v14;
  v17 = *(_DWORD *)&ErrorRecord[1].Header.Revision.MinorRevision + v14;
  ErrorRecord[1].Header.PartitionId.Data1 = ErrorPacket->ErrorSeverity;
  v18 = v17 + 272;
  if( v17 + 272 > v6 )
    return -1073741789;
  v19 = (_OWORD *)((char *)&ErrorRecord->Header.Signature + v17);
  v20 = 2i64;
  do
  {
    *v19 = *(_OWORD *)&v15->Signature;
    v19[1] = *(_OWORD *)&v15->ErrorType;
    v19[2] = v15->NotifyType;
    v19[3] = *(_OWORD *)&v15->Context;
    v19[4] = *(_OWORD *)&v15->DataOffset;
    v19[5] = *(_OWORD *)&v15[1].Signature;
    v19[6] = *(_OWORD *)&v15[1].ErrorType;
    v19 += 8;
    NotifyType = v15[1].NotifyType;
    v15 = (_WHEA_ERROR_PACKET_V2 *)((char *)v15 + 128);
    *(v19 - 1) = NotifyType;
    --v20;
  }
  while( v20 );
  *v19 = *(_OWORD *)&v15->Signature;
  *(_DWORD *)ErrorRecord[1].Header.CreatorId.Data4 = v17;
  *(_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 + v18 > v6 )
    return -1073741789;
  memmove((char *)ErrorRecord + v18, ErrorPacket, Length);
  ErrorRecord[1].SectionDescriptor[0].SectionType.Data1 = v18;
  *(_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 v9;
}

Referenced by:

HalpCreateMachineCheckErrorRecord