HalpCreateNMIErrorRecord

NTSTATUS __stdcall HalpCreateNMIErrorRecord(
        _WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource,
        _WHEA_ERROR_PACKET_V2 *ErrorPacket,
        _WHEA_ERROR_RECORD *ErrorRecord,
        UINT64 BufferSize,
        VOID *Context){
  unsigned int v6; 
  NTSTATUS v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned int v14; 
  unsigned int Length; 

  v6 = BufferSize;
  v9 = 0;
  memset(ErrorRecord, 0i64, BufferSize);
  v10 = 72 * ErrorSource->MaxSectionsPerRecord + 128;
  if( v10 > v6 )
    return -1073741789;
  WheaInitializeRecordHeader(&ErrorRecord->Header);
  v11 = v10;
  v12 = v10 + 192;
  ErrorRecord->Header.SectionCount = 3;
  ErrorRecord->Header.Severity = ErrorPacket->ErrorSeverity;
  ErrorRecord->Header.Length = v6;
  ErrorRecord->Header.NotifyType = NMI_NOTIFY_TYPE_GUID;
  if( v12 > v6 )
    return -1073741789;
  ((void(__fastcall *)(_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *, char *))off_140C006B8[0])(
    ErrorRecord->SectionDescriptor,
    (char *)ErrorRecord + v11);
  ErrorRecord[1].Header.Severity |= 1u;
  ErrorRecord->SectionDescriptor[0].SectionOffset = v11;
  ErrorRecord[1].Header.Signature = v12;
  HIWORD(ErrorRecord[1].Header.SignatureEnd) = 768;
  *(_DWORD *)&ErrorRecord[1].Header.Revision.MinorRevision = 12;
  v13 = v12;
  v14 = v12 + 12;
  *(GUID *)&ErrorRecord[1].Header.ValidBits.0 = NMI_SECTION_GUID;
  ErrorRecord[1].Header.PartitionId.Data1 = ErrorPacket->ErrorSeverity;
  if( v14 > v6 )
    return -1073741789;
  *(_QWORD *)((char *)&ErrorRecord->Header.Signature + v13) = *(_QWORD *)&ErrorPacket[1].Signature;
  *(unsigned int *)((char *)&ErrorRecord->Header.SignatureEnd + v13 + 2) = ErrorPacket[1].Length;
  *(_DWORD *)ErrorRecord[1].Header.CreatorId.Data4 = v14;
  Length = ErrorPacket->Length;
  *(_DWORD *)&ErrorRecord[1].Header.CreatorId.Data4[4] = Length;
  LOWORD(ErrorRecord[1].Header.NotifyType.Data1) = 768;
  *(GUID *)ErrorRecord[1].Header.NotifyType.Data4 = WHEA_ERROR_PACKET_SECTION_GUID;
  *(_DWORD *)&ErrorRecord[1].Header.Reserved[4] = ErrorPacket->ErrorSeverity;
  if( Length + v14 > v6 )
    return -1073741789;
  memmove((char *)ErrorRecord + v14, ErrorPacket, ErrorPacket->Length);
  return v9;
}

Referenced by:

HalpCreateErrorRecord