WheapInitializeErrorSourceTable
INT64 __fastcall WheapInitializeErrorSourceTable(UINT64 Count, _WHEA_ERROR_SOURCE_DESCRIPTOR *Buffer){
int v2;
unsigned int v4;
_WHEAP_ERROR_SOURCE *PoolWithTag;
_WHEAP_ERROR_SOURCE *v6;
char *v7;
_WHEA_ERROR_SOURCE_DESCRIPTOR *v8;
__int64 v9;
__int128 v10;
__int64 *v11;
int v12;
v2 = 0;
v4 = Count;
if( !(_DWORD)Count )
return 0i64;
while( 1 )
{
if( *((_DWORD *)Buffer + 2) > 0x10u )
goto LABEL_11;
PoolWithTag = (_WHEAP_ERROR_SOURCE *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x430ui64, 0x61656857ui64);
v6 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memset((INT64)PoolWithTag, 0i64);
v7 = (char *)v6 + 96;
v8 = Buffer;
v9 = 7i64;
do
{
v10 = *(_OWORD *)v8;
v8 = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)v8 + 128);
*(_OWORD *)v7 = v10;
v7 += 128;
*((_OWORD *)v7 - 7) = *((_OWORD *)v8 - 7);
*((_OWORD *)v7 - 6) = *((_OWORD *)v8 - 6);
*((_OWORD *)v7 - 5) = *((_OWORD *)v8 - 5);
*((_OWORD *)v7 - 4) = *((_OWORD *)v8 - 4);
*((_OWORD *)v7 - 3) = *((_OWORD *)v8 - 3);
*((_OWORD *)v7 - 2) = *((_OWORD *)v8 - 2);
*((_OWORD *)v7 - 1) = *((_OWORD *)v8 - 1);
--v9;
}
while( v9 );
*(_OWORD *)v7 = *(_OWORD *)v8;
*((_OWORD *)v7 + 1) = *((_OWORD *)v8 + 1);
*((_OWORD *)v7 + 2) = *((_OWORD *)v8 + 2);
*((_OWORD *)v7 + 3) = *((_OWORD *)v8 + 3);
*((_QWORD *)v7 + 8) = *((_QWORD *)v8 + 8);
*((_DWORD *)v7 + 18) = *((_DWORD *)v8 + 18);
v11 = qword_140CF4348;
if( LOBYTE(qword_140CF4348[8 * (__int64)*((int *)Buffer + 2)]) )
{
v12 = WheapInitializeErrorSource(v6);
if( v12 < 0 )
{
ExFreeHeapPool(v6);
return(unsigned int)v12;
}
}
else
{
*((_DWORD *)v6 + 10) = *((_DWORD *)Buffer + 2);
*((_BYTE *)v6 + 88) = 1;
}
if( *((_DWORD *)v6 + 26) != 5 || *((_DWORD *)v6 + 36) == 0xFFFF )
WheapAddErrorSource(v11, v6);
Buffer = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)Buffer + *(_DWORD *)Buffer);
LABEL_11:
if( ++v2 >= v4 )
return 0i64;
}
}Referenced by:
WheaInitialize