HalpCreateMcaMemoryErrorRecord
NTSTATUS __stdcall HalpCreateMcaMemoryErrorRecord(
WHEA_ERROR_SOURCE_DESCRIPTOR *ErrorSource,
_WHEA_ERROR_PACKET_V2 *ErrorPacket,
WHEA_ERROR_RECORD *ErrorRecord,
PVOID Context){
unsigned int v5;
NTSTATUS v8;
unsigned int v9;
unsigned int v10;
unsigned int v11;
_WHEA_ERROR_RECORD_HEADER_FLAGS v12;
unsigned int v13;
_WHEA_ERROR_PACKET_V2 *v14;
_WHEA_ERROR_PACKET_V2 *v15;
unsigned int v16;
unsigned int v17;
_OWORD *v18;
__int64 v19;
_GUID NotifyType;
unsigned int Length;
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;
ErrorRecord->Header.Severity = ErrorPacket->ErrorSeverity;
ErrorRecord->Header.Length = v5;
ErrorRecord->Header.NotifyType = ErrorPacket->NotifyType;
v10 = ErrorRecord->Header.Flags.AsULONG ^ (ErrorRecord->Header.Flags.AsULONG ^ (2 * ErrorPacket->Flags.AsULONG)) & 2;
ErrorRecord->Header.Flags.AsULONG = v10;
v11 = (v10 ^ (ErrorPacket->Flags.AsULONG >> 1)) & 4 ^ v10;
ErrorRecord->Header.Flags.AsULONG = v11;
v12.AsULONG = (*(_BYTE *)&ErrorPacket->Flags.0 & 0xC0) == 64 ? v11 & 0xFFFFFFDF : v11 | 0x20;
v13 = v9 + 80;
ErrorRecord->Header.Flags = v12;
if( v9 + 80 > v5 )
return -1073741789;
v14 = ErrorPacket + 1;
v15 = ErrorPacket + 1;
if( HalpMcaExtendedLoggingSupported )
HalpAddMcaExtendedLogToMemoryErrorSection(
(INT64)v15,
(INT64)ErrorRecord->SectionDescriptor,
(unsigned int *)((char *)&ErrorRecord->Header.Signature + v9));
else
HalpAddMcaToMemoryErrorSection((INT64)v15, (unsigned int *)((char *)&ErrorRecord->Header.Signature + v9));
ErrorRecord->SectionDescriptor[0].Flags.AsULONG |= 1u;
ErrorRecord->SectionDescriptor[0].SectionOffset = v9;
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( v9 + 272 > v5 )
return -1073741789;
((void(__fastcall *)(WHEA_ERROR_RECORD *, char *))off_140C006B8[0])(&ErrorRecord[1], (char *)ErrorRecord + v13);
HalpAddMcaToProcessorGenericSection(
(WHEA_XPF_MCA_SECTION *)&ErrorPacket[1],
(_WHEA_PROCESSOR_GENERIC_ERROR_SECTION *)((char *)ErrorRecord + v13));
ErrorRecord[1].Header.Signature = v13;
v16 = *(_DWORD *)&ErrorRecord[1].Header.Revision.MinorRevision + v13;
ErrorRecord[1].Header.PartitionId.Data1 = ErrorPacket->ErrorSeverity;
v17 = v16 + 272;
if( v16 + 272 > v5 )
return -1073741789;
v18 = (_OWORD *)((char *)&ErrorRecord->Header.Signature + v16);
v19 = 2i64;
do
{
*v18 = *(_OWORD *)&v14->Signature;
v18[1] = *(_OWORD *)&v14->ErrorType;
v18[2] = v14->NotifyType;
v18[3] = *(_OWORD *)&v14->Context;
v18[4] = *(_OWORD *)&v14->DataOffset;
v18[5] = *(_OWORD *)&v14[1].Signature;
v18[6] = *(_OWORD *)&v14[1].ErrorType;
v18 += 8;
NotifyType = v14[1].NotifyType;
v14 = (_WHEA_ERROR_PACKET_V2 *)((char *)v14 + 128);
*(v18 - 1) = NotifyType;
--v19;
}
while( v19 );
*v18 = *(_OWORD *)&v14->Signature;
*(_DWORD *)ErrorRecord[1].Header.CreatorId.Data4 = v16;
*(_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 + v17 > v5 )
return -1073741789;
memmove((UINT8 *)ErrorRecord + v17, (UINT8 *)ErrorPacket, Length);
ErrorRecord[1].SectionDescriptor[0].SectionType.Data1 = v17;
*(_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