HalpCreateMcaProcessorErrorRecord
NTSTATUS __stdcall HalpCreateMcaProcessorErrorRecord(
_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;
_WHEA_PROCESSOR_GENERIC_ERROR_SECTION *v11;
unsigned int v12;
_WHEA_ERROR_PACKET_V2 *v13;
int v14;
unsigned int v15;
unsigned int v16;
__int64 v17;
_OWORD *v18;
_GUID NotifyType;
unsigned int Length;
unsigned int v22;
UINT64 SectionLength;
v6 = (unsigned int)Context;
v9 = 0;
LODWORD(SectionLength) = 0;
memset(ErrorRecord, 0i64, (size_t)Context);
v10 = 72 * ErrorSource->MaxSectionsPerRecord + 128;
if( v10 > v6 )
return -1073741789;
WheaInitializeRecordHeader(&ErrorRecord->Header);
ErrorRecord->Header.SectionCount = 4;
v11 = (_WHEA_PROCESSOR_GENERIC_ERROR_SECTION *)((char *)ErrorRecord + v10);
ErrorRecord->Header.Severity = ErrorPacket->ErrorSeverity;
ErrorRecord->Header.Length = v6;
v22 = v10;
v12 = v10 + 192;
ErrorRecord->Header.NotifyType = ErrorPacket->NotifyType;
ErrorRecord->Header.Flags.AsULONG ^= (ErrorRecord->Header.Flags.AsULONG ^ (2 * ErrorPacket->Flags._bf_0)) & 2;
ErrorRecord->Header.Flags.AsULONG ^= (ErrorRecord->Header.Flags.AsULONG ^ ((unsigned __int32)ErrorPacket->Flags._bf_0 >> 1)) & 4;
if( v12 > v6 )
return -1073741789;
((void(__fastcall *)(_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *, _WHEA_PROCESSOR_GENERIC_ERROR_SECTION *))off_140C006B8[0])(
ErrorRecord->SectionDescriptor,
v11);
v13 = ErrorPacket + 1;
HalpAddMcaToProcessorGenericSection((_WHEA_XPF_MCA_SECTION *)&ErrorPacket[1], v11);
ErrorRecord->SectionDescriptor[0].Flags.AsULONG |= 1u;
ErrorRecord->SectionDescriptor[0].SectionOffset = v22;
ErrorRecord->SectionDescriptor[0].SectionSeverity = ErrorPacket->ErrorSeverity;
if( v12 + 65 > v6 )
return -1073741789;
HalpAddMcaToProcessorSpecificSection(
(_WHEA_XPF_MCA_SECTION *)&ErrorPacket[1],
(_WHEA_XPF_PROCESSOR_ERROR_SECTION *)((char *)ErrorRecord + v12),
&SectionLength);
v14 = SectionLength;
ErrorRecord[1].Header.Signature = v12;
*(_DWORD *)&ErrorRecord[1].Header.Revision.MinorRevision = v14;
v15 = v12 + v14;
HIWORD(ErrorRecord[1].Header.SignatureEnd) = 768;
v16 = v12 + v14 + 272;
*(GUID *)&ErrorRecord[1].Header.ValidBits.0 = XPF_PROCESSOR_ERROR_SECTION_GUID;
ErrorRecord[1].Header.PartitionId.Data1 = ErrorPacket->ErrorSeverity;
if( v16 > v6 )
return -1073741789;
v17 = 2i64;
v18 = (_OWORD *)((char *)&ErrorRecord->Header.Signature + v15);
do
{
*v18 = *(_OWORD *)&v13->Signature;
v18[1] = *(_OWORD *)&v13->ErrorType;
v18[2] = v13->NotifyType;
v18[3] = *(_OWORD *)&v13->Context;
v18[4] = *(_OWORD *)&v13->DataOffset;
v18[5] = *(_OWORD *)&v13[1].Signature;
v18[6] = *(_OWORD *)&v13[1].ErrorType;
v18 += 8;
NotifyType = v13[1].NotifyType;
v13 = (_WHEA_ERROR_PACKET_V2 *)((char *)v13 + 128);
*(v18 - 1) = NotifyType;
--v17;
}
while( v17 );
*v18 = *(_OWORD *)&v13->Signature;
*(_DWORD *)ErrorRecord[1].Header.CreatorId.Data4 = v15;
*(_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 + v16 > v6 )
return -1073741789;
memmove((char *)ErrorRecord + v16, ErrorPacket, Length);
ErrorRecord[1].SectionDescriptor[0].SectionType.Data1 = v16;
*(_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