WheapCreateRecordFromGenericErrorData
NTSTATUS __stdcall WheapCreateRecordFromGenericErrorData(
_WHEA_ERROR_SOURCE_DESCRIPTOR *Source,
_WHEA_ERROR_PACKET_V2 *Packet,
_WHEA_ERROR_RECORD *Record,
UINT64 BufferSize,
VOID *Context){
size_t v7;
unsigned int v8;
unsigned int DataLength;
_DWORD *v10;
CHAR *v11;
unsigned int v12;
unsigned int v13;
int v14;
INT64 v15;
_WHEA_ERROR_RECORD_HEADER_FLAGS v16;
char v17;
int v18;
_WHEA_GENERIC_ERROR_DATA_ENTRY_V2 *v19;
ULONG ErrorDataLength;
unsigned int v21;
int v22;
bool v23;
unsigned int v24;
int v25;
__int64 v26;
int v27;
_WHEA_GENERIC_ERROR_DATA_ENTRY_V2 *v28;
_EX_RUNDOWN_REF **v29;
CHAR *v30;
UINT64 ErrorEntryLength;
INT64 Structured;
int Src[20];
v7 = BufferSize;
memset(Src, 0i64, 0x48u);
v8 = 20;
DataLength = Packet->DataLength;
v10 = (unsigned int *)((char *)&Packet->Signature + Packet->DataOffset);
if( DataLength >= 0x14 )
{
v12 = v10[3] + 20;
if( v12 < 0x14 )
{
v11 = (CHAR *)"Overflow_Finding_Structured_Len";
goto LABEL_47;
}
v13 = v10[1];
if( v13 && (v14 = v10[2]) != 0 )
{
if( v12 > v13 )
{
v11 = "Unstructered_Data_Too_Soon";
goto LABEL_47;
}
if( v14 + v13 < v13 )
{
v11 = "Overflow_Unstructured_End";
goto LABEL_47;
}
if( v14 + v13 > DataLength )
{
v11 = "Unstructured_Overruns_Buffer";
goto LABEL_47;
}
}
else if( v12 > DataLength )
{
v11 = "Error_Overruns_Buffer";
goto LABEL_47;
}
if( v7 < 0x80 )
{
v11 = "Header_Overruns_Buffer";
goto LABEL_47;
}
memset(Record, 0i64, v7);
WheaInitializeRecordHeader(&Record->Header);
Record->Header.Severity = Packet->ErrorSeverity;
Record->Header.NotifyType = Packet->NotifyType;
Record->Header.Flags.AsULONG ^= (Record->Header.Flags.AsULONG ^ (2 * Packet->Flags._bf_0)) & 2;
v16.0 = ($9E46E3073B5FFFFC8430EEE7126B55BF)Record->Header.Flags;
v17 = *(_BYTE *)&v16.0 ^ ((unsigned __int32)Packet->Flags._bf_0 >> 1);
Record->Header.Length = v7;
Record->Header.Flags.AsULONG = v16.AsULONG ^ v17 & 4;
v18 = (*v10 >> 4) & 0x3FF;
if( v18 )
{
while( v8 + 64 >= v8 )
{
if( v8 + 64 > v12 )
{
v11 = "Entry_Header_Overruns_Structure";
goto LABEL_47;
}
v19 = (_WHEA_GENERIC_ERROR_DATA_ENTRY_V2 *)((char *)v10 + v8);
ErrorDataLength = v19->ErrorDataLength;
if( v19->Revision.AsUSHORT == 768 )
{
v21 = ErrorDataLength + 72;
v22 = -1;
v23 = v21 < 0x48;
}
else
{
v21 = ErrorDataLength + 64;
v22 = -1;
v23 = v21 < 0x40;
}
if( !v23 )
v22 = v21;
if( v23 )
{
v11 = "Overflow_Entry_Length";
goto LABEL_47;
}
v24 = v8 + v22;
if( v8 + v22 < v8 )
{
v11 = "Overflow_Next_Entry_Offset";
goto LABEL_47;
}
v8 += v22;
if( v24 > v12 )
{
v11 = "Next_Entry_Overruns_Structure";
goto LABEL_47;
}
LODWORD(ErrorEntryLength) = v22;
v25 = WheapAddSectionFromGenericErrorData(Source, Record, v7, v19, ErrorEntryLength, 1u);
if( v25 < 0 )
{
v30 = (CHAR *)"Failed_Add_Section";
goto LABEL_34;
}
++Src[16];
if( !--v18 )
goto LABEL_29;
}
v11 = "Overflow_Entry_Header_Offset";
goto LABEL_47;
}
LABEL_29:
v26 = (unsigned int)v10[1];
if( (_DWORD)v26 && (v27 = v10[2]) != 0 )
{
v28 = (_WHEA_GENERIC_ERROR_DATA_ENTRY_V2 *)((char *)v10 + v26);
v29 = (_EX_RUNDOWN_REF **)Source;
LODWORD(ErrorEntryLength) = v27;
v25 = WheapAddSectionFromGenericErrorData(Source, Record, v7, v28, ErrorEntryLength, 0);
if( v25 < 0 )
{
v30 = "Failed_Add_Unstructured";
LABEL_34:
RtlStringCchCopyA((CHAR *)&Src[8], 0x20ui64, v30);
LABEL_44:
if( v25 >= 0 )
return v25;
goto LABEL_48;
}
}
else
{
v29 = (_EX_RUNDOWN_REF **)Source;
}
if( Packet->ErrorSeverity == WheaErrSevRecoverable )
WheapAddRecoveryPacketToErrorRecord(v29, (INT64 *)Record, v7, v15, ErrorEntryLength, Structured);
v25 = 0;
goto LABEL_44;
}
v11 = "Error_Packet_Lenth_Too_Small";
LABEL_47:
v25 = -1073741811;
RtlStringCchCopyA((CHAR *)&Src[8], 0x20ui64, v11);
LABEL_48:
if( !Source->Info.XpfMceDescriptor.Banks[0].BankNumber )
{
Src[3] = 0;
Src[0] = 1733060695;
Src[1] = 1;
Src[2] = 72;
Src[5] = -2147483627;
Src[4] = 1280201291;
Src[6] = 2;
Src[7] = 40;
Src[17] = v25;
WheaLogInternalEvent(Src);
}
return v25;
}Referenced by:
WheapDefaultErrSrcCreateRecord
WheapDeviceDriverCreateRecord