WheapInitErrorReportDeviceDriver
NTSTATUS __stdcall WheapInitErrorReportDeviceDriver(UINT64 ErrorSourceId, VOID **a2){
unsigned int v3;
char v4;
NTSTATUS v5;
char *PreallocatedPacketBuffer;
INT64 v7;
UINT64 v8;
_WHEAP_ERROR_SOURCE *ErrorSource;
_WHEA_ERROR_SOURCE_DESCRIPTOR *p_Descriptor;
__int64 v11;
__int64 v12;
signed __int32 v13;
unsigned int v14;
signed __int32 v15;
unsigned int v16;
unsigned int v17;
VOID *PoolWithTag;
char v20;
unsigned int ErrorSourceIda;
int Src[16];
ErrorSourceIda = ErrorSourceId;
v3 = ErrorSourceId;
memset(Src, 0i64, sizeof(Src));
v4 = 0;
*a2 = 0i64;
v5 = 0;
v20 = 0;
PreallocatedPacketBuffer = 0i64;
ErrorSource = WheapGetErrorSource((_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable, v3, v7, v8);
p_Descriptor = &ErrorSource->Descriptor;
v11 = -(__int64)ErrorSource;
v12 = (unsigned __int64)p_Descriptor & -(__int64)(v11 != 0);
if( !v12 || (v13 = *(_DWORD *)(((unsigned __int64)p_Descriptor & -(__int64)(v11 != 0)) + 0x98), v13 == -1) )
{
Src[5] = -2147483605;
LABEL_21:
Src[0] = 1733060695;
Src[7] = 32;
Src[1] = 1;
Src[2] = 64;
Src[3] = 1;
Src[4] = 1280201291;
Src[6] = 2;
RtlStringCchCopyA((CHAR *)&Src[8], 0x20ui64, (CHAR *)"InitErrorReportDeviceDriver");
WheaLogInternalEvent(Src);
v5 = -1073741811;
LABEL_22:
if( v20 )
_InterlockedDecrement((volatile signed __int32 *)(v12 + 152));
if( PreallocatedPacketBuffer )
ExFreePoolWithTag(PreallocatedPacketBuffer, 0x41454857u);
LABEL_26:
if( *a2 )
ExFreePoolWithTag(*a2, 0x41454857u);
}
else
{
v14 = 0;
while( 1 )
{
v15 = v13;
if( v13 == -1 )
{
v5 = -1073741811;
goto LABEL_26;
}
v13 = _InterlockedCompareExchange((volatile signed __int32 *)(v12 + 152), v13 + 1, v13);
if( v15 == v13 )
break;
if( ++v14 >= 0xA )
goto LABEL_9;
}
v20 = 1;
LABEL_9:
if( v14 >= 0xA )
{
Src[5] = -2147483604;
goto LABEL_21;
}
v16 = *(_DWORD *)(v12 + 16);
if( KeGetCurrentIrql() >= 2u )
{
PreallocatedPacketBuffer = (char *)WheapGetPreallocatedPacketBuffer(ErrorSourceIda);
if( !PreallocatedPacketBuffer )
{
LABEL_13:
v5 = -1073741670;
goto LABEL_22;
}
PoolWithTag = *a2;
v4 = 1;
v17 = v16;
}
else
{
v17 = *(_DWORD *)(v12 + 16);
PreallocatedPacketBuffer = (char *)ExAllocatePoolWithTag(0x200ui64, v16, 1095059543i64);
if( !PreallocatedPacketBuffer )
goto LABEL_13;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x68ui64, 1095059543i64);
*a2 = PoolWithTag;
if( !PoolWithTag )
goto LABEL_13;
}
memset(PoolWithTag, 0i64, 0x68u);
*(_DWORD *)*a2 = 1095059543;
*((_DWORD *)*a2 + 3) = ErrorSourceIda;
*((_DWORD *)*a2 + 13) = 2;
*((_BYTE *)*a2 + 48) = v4;
*((_QWORD *)*a2 + 5) = PreallocatedPacketBuffer + 8;
*((_QWORD *)*a2 + 4) = PreallocatedPacketBuffer;
memset(PreallocatedPacketBuffer + 8, 0i64, v17 - 8);
*((_DWORD *)PreallocatedPacketBuffer + 2) = 1095059543;
*((_DWORD *)PreallocatedPacketBuffer + 3) = 3;
*((_DWORD *)PreallocatedPacketBuffer + 4) = v16 - 112;
*((_DWORD *)PreallocatedPacketBuffer + 19) = v16 - 192;
*((_DWORD *)PreallocatedPacketBuffer + 6) = 6;
*((_DWORD *)PreallocatedPacketBuffer + 7) = -2147483646;
*((_DWORD *)PreallocatedPacketBuffer + 8) = ErrorSourceIda;
*((_DWORD *)PreallocatedPacketBuffer + 9) = 12;
*(_OWORD *)(PreallocatedPacketBuffer + 40) = DEVICE_DRIVER_NOTIFY_TYPE_GUID;
*((_DWORD *)PreallocatedPacketBuffer + 16) = 7;
*((_DWORD *)PreallocatedPacketBuffer + 18) = 80;
*((_QWORD *)*a2 + 2) = PreallocatedPacketBuffer + 88;
*((_DWORD *)PreallocatedPacketBuffer + 22) &= 0xFFFFC00F;
*((_DWORD *)PreallocatedPacketBuffer + 26) = 2;
*((_DWORD *)PreallocatedPacketBuffer + 25) = *((_DWORD *)PreallocatedPacketBuffer + 4) - 100;
*((_QWORD *)*a2 + 3) = PreallocatedPacketBuffer + 108;
*((_DWORD *)*a2 + 2) += 100;
}
return v5;
}Referenced by:
WheaCreateHwErrorReportDeviceDriver