WheapInitializeErrorSourceTable
NTSTATUS __stdcall WheapInitializeErrorSourceTable(UINT64 Count, _WHEA_ERROR_SOURCE_DESCRIPTOR *Buffer){
int v2;
unsigned int v4;
VOID **PoolWithTag;
VOID **v6;
VOID **v7;
_WHEA_ERROR_SOURCE_DESCRIPTOR *v8;
__int64 v9;
__int128 v10;
char *v11;
int v12;
v2 = 0;
v4 = Count;
if( !(_DWORD)Count )
return 0;
while( 1 )
{
if( Buffer->Type > (unsigned int)WheaErrSrcTypeDeviceDriver )
goto LABEL_11;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x430ui64, 1634035799i64);
v6 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, 0x430u);
v7 = v6 + 12;
v8 = Buffer;
v9 = 7i64;
do
{
v10 = *(_OWORD *)&v8->Length;
v8 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v8 + 128);
*(_OWORD *)v7 = v10;
v7 += 16;
*((_OWORD *)v7 - 7) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 820);
*((_OWORD *)v7 - 6) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 836);
*((_OWORD *)v7 - 5) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 852);
*((_OWORD *)v7 - 4) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 868);
*((_OWORD *)v7 - 3) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 884);
*((_OWORD *)v7 - 2) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 900);
*((_OWORD *)v7 - 1) = *(_OWORD *)((char *)&v8[-1].Info.DeviceDriverDescriptor + 916);
--v9;
}
while( v9 );
*(_OWORD *)v7 = *(_OWORD *)&v8->Length;
*((_OWORD *)v7 + 1) = *(_OWORD *)&v8->MaxRawDataLength;
*((_OWORD *)v7 + 2) = *(_OWORD *)&v8->PlatformErrorSourceId;
*((_OWORD *)v7 + 3) = *(_OWORD *)&v8->Info.AerEndpointDescriptor.Slot.u;
v7[8] = *(VOID **)&v8->Info.DeviceDriverDescriptor.PacketLength;
*((_DWORD *)v7 + 18) = v8->Info.XpfMceDescriptor.Banks[0].StatusMsr;
v11 = (char *)&stru_140CF2E80 + 5320;
if( *((_BYTE *)&stru_140CF2E80 + 64 * (__int64)(int)Buffer->Type + 5320) )
{
v12 = WheapInitializeErrorSource((_WHEAP_ERROR_SOURCE *)v6);
if( v12 < 0 )
{
ExFreeHeapPool(v6);
return v12;
}
}
else
{
*((_DWORD *)v6 + 10) = Buffer->Type;
*((_BYTE *)v6 + 88) = 1;
}
if( *((_DWORD *)v6 + 26) != 5 || *((_DWORD *)v6 + 36) == 0xFFFF )
WheapAddErrorSource(v11, v6);
Buffer = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)Buffer + Buffer->Length);
LABEL_11:
if( ++v2 >= v4 )
return 0;
}
}Referenced by:
WheaInitialize