WheapWmiExecuteErrorSourceMethod
NTSTATUS __stdcall WheapWmiExecuteErrorSourceMethod(
UINT64 MethodId,
UINT64 BufferSize,
UINT8 *Buffer,
UINT64 InputBufferSize,
UINT64 *BytesUsed){
int v6;
int v7;
int v8;
int v9;
unsigned int v10;
NTSTATUS v11;
_WHEAP_ERROR_SOURCE *ErrorSource;
NTSTATUS v13;
_WHEAP_ERROR_SOURCE *v14;
UINT8 *v15;
__int64 v16;
char *v17;
__int128 v18;
__int128 v19;
__int128 v20;
__int128 v21;
__int128 v22;
__int128 v23;
__int128 v24;
__int64 v25;
__int128 v26;
__int128 v27;
__int128 v28;
_WHEAP_ERROR_SOURCE *v29;
_WHEA_ERROR_SOURCE_DESCRIPTOR *p_Descriptor;
__int64 v31;
UINT8 *v32;
__int128 v33;
void **v34;
UINT8 *v35;
int v36;
unsigned int i;
UINT8 *v38;
char *v39;
__int64 v40;
__int128 v41;
char v43[976];
v6 = MethodId - 1;
if( v6 )
{
v7 = v6 - 1;
if( v7 )
{
v8 = v7 - 1;
if( v8 )
{
v9 = v8 - 1;
if( v9 )
{
v10 = 0;
if( v9 != 1 )
{
v11 = -1073741161;
goto LABEL_44;
}
if( (unsigned int)InputBufferSize >= 4 )
{
v10 = 4;
if( (unsigned int)BufferSize >= 4 )
{
ErrorSource = WheapGetErrorSource(
(_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable,
*(unsigned int *)Buffer,
(INT64)Buffer,
InputBufferSize);
if( ErrorSource )
{
if( ErrorSource->Descriptor.State != WheaErrSrcStateStopped )
{
v13 = PshedDisableErrorSource(&ErrorSource->Descriptor);
LABEL_17:
v11 = v13;
goto LABEL_18;
}
goto LABEL_18;
}
goto LABEL_35;
}
goto LABEL_37;
}
}
else
{
v10 = 0;
if( (unsigned int)InputBufferSize >= 4 )
{
v10 = 4;
if( (unsigned int)BufferSize >= 4 )
{
v14 = WheapGetErrorSource(
(_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable,
*(unsigned int *)Buffer,
(INT64)Buffer,
InputBufferSize);
if( v14 )
{
if( v14->Descriptor.State != WheaErrSrcStateStarted )
{
v13 = PshedEnableErrorSource(&v14->Descriptor);
goto LABEL_17;
}
LABEL_18:
*(_DWORD *)Buffer = v11;
goto LABEL_44;
}
LABEL_35:
v11 = -1073741275;
goto LABEL_44;
}
LABEL_37:
v11 = -1073741789;
goto LABEL_44;
}
}
LABEL_28:
v11 = -1073741811;
goto LABEL_44;
}
v10 = 0;
if( (unsigned int)InputBufferSize < 0x3D0 )
goto LABEL_28;
v10 = 4;
if( (unsigned int)BufferSize < 4 )
goto LABEL_37;
if( *(_DWORD *)Buffer != 972 )
{
v10 = 0;
goto LABEL_28;
}
v15 = Buffer + 4;
v16 = 7i64;
v17 = v43;
do
{
v18 = *((_OWORD *)v15 + 1);
*(_OWORD *)v17 = *(_OWORD *)v15;
v19 = *((_OWORD *)v15 + 2);
*((_OWORD *)v17 + 1) = v18;
v20 = *((_OWORD *)v15 + 3);
*((_OWORD *)v17 + 2) = v19;
v21 = *((_OWORD *)v15 + 4);
*((_OWORD *)v17 + 3) = v20;
v22 = *((_OWORD *)v15 + 5);
*((_OWORD *)v17 + 4) = v21;
v23 = *((_OWORD *)v15 + 6);
*((_OWORD *)v17 + 5) = v22;
v24 = *((_OWORD *)v15 + 7);
v15 += 128;
*((_OWORD *)v17 + 6) = v23;
v17 += 128;
*((_OWORD *)v17 - 1) = v24;
--v16;
}
while( v16 );
v25 = *((_QWORD *)v15 + 8);
v26 = *((_OWORD *)v15 + 1);
*(_OWORD *)v17 = *(_OWORD *)v15;
v27 = *((_OWORD *)v15 + 2);
*((_OWORD *)v17 + 1) = v26;
v28 = *((_OWORD *)v15 + 3);
*((_OWORD *)v17 + 2) = v27;
*((_OWORD *)v17 + 3) = v28;
*((_QWORD *)v17 + 8) = v25;
*((_DWORD *)v17 + 18) = *((_DWORD *)v15 + 18);
v11 = PshedSetErrorSourceInfo(v43, v17, 0i64, 128i64);
*(_DWORD *)Buffer = v11;
}
else
{
v10 = 0;
if( !*(&WheapErrorSourceTable + 1) )
goto LABEL_35;
if( (unsigned int)InputBufferSize < 4 )
goto LABEL_28;
v10 = 980;
if( (unsigned int)BufferSize < 0x3D4 )
goto LABEL_37;
v29 = WheapGetErrorSource(
(_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable,
*(unsigned int *)Buffer,
(INT64)Buffer,
InputBufferSize);
if( !v29 )
goto LABEL_35;
*(_DWORD *)Buffer = v11;
p_Descriptor = &v29->Descriptor;
v31 = 7i64;
*((_DWORD *)Buffer + 1) = 972;
v32 = Buffer + 8;
do
{
*(_OWORD *)v32 = *(_OWORD *)&p_Descriptor->Length;
*((_OWORD *)v32 + 1) = *(_OWORD *)&p_Descriptor->MaxRawDataLength;
*((_OWORD *)v32 + 2) = *(_OWORD *)&p_Descriptor->PlatformErrorSourceId;
*((_OWORD *)v32 + 3) = *(_OWORD *)&p_Descriptor->Info.AerEndpointDescriptor.Slot.u;
*((_OWORD *)v32 + 4) = *(_OWORD *)&p_Descriptor->Info.DeviceDriverDescriptor.PacketLength;
*((_OWORD *)v32 + 5) = *(_OWORD *)&p_Descriptor->Info.DeviceDriverDescriptor.Config.Initialize;
*((_OWORD *)v32 + 6) = *(_OWORD *)&p_Descriptor->Info.DeviceDriverDescriptor.Config.Correct;
v32 += 128;
v33 = *(_OWORD *)p_Descriptor->Info.DeviceDriverDescriptor.CreatorId.Data4;
p_Descriptor = (_WHEA_ERROR_SOURCE_DESCRIPTOR *)((char *)p_Descriptor + 128);
*((_OWORD *)v32 - 1) = v33;
--v31;
}
while( v31 );
*(_OWORD *)v32 = *(_OWORD *)&p_Descriptor->Length;
*((_OWORD *)v32 + 1) = *(_OWORD *)&p_Descriptor->MaxRawDataLength;
*((_OWORD *)v32 + 2) = *(_OWORD *)&p_Descriptor->PlatformErrorSourceId;
*((_OWORD *)v32 + 3) = *(_OWORD *)&p_Descriptor->Info.AerEndpointDescriptor.Slot.u;
*((_QWORD *)v32 + 8) = *(_QWORD *)&p_Descriptor->Info.DeviceDriverDescriptor.PacketLength;
*((_DWORD *)v32 + 18) = p_Descriptor->Info.XpfMceDescriptor.Banks[0].StatusMsr;
}
}
else
{
v11 = 0;
v10 = 0;
if( !*(&WheapErrorSourceTable + 1) )
goto LABEL_35;
v10 = 972 * *(&WheapErrorSourceTable + 1) + 12;
if( v10 > (unsigned int)BufferSize )
goto LABEL_37;
*(_DWORD *)Buffer = 0;
v34 = (void **)*(&WheapErrorSourceTable + 2);
v35 = Buffer + 12;
v36 = 0;
for( i = 0; v34 != (void **)((char *)&WheapErrorSourceTable + 16); v34 = (void **)*v34 )
{
if( i >= *(&WheapErrorSourceTable + 1) )
break;
v38 = v35;
v39 = (char *)(v34 + 12);
v40 = 7i64;
do
{
*(_OWORD *)v38 = *(_OWORD *)v39;
*((_OWORD *)v38 + 1) = *((_OWORD *)v39 + 1);
*((_OWORD *)v38 + 2) = *((_OWORD *)v39 + 2);
*((_OWORD *)v38 + 3) = *((_OWORD *)v39 + 3);
*((_OWORD *)v38 + 4) = *((_OWORD *)v39 + 4);
*((_OWORD *)v38 + 5) = *((_OWORD *)v39 + 5);
*((_OWORD *)v38 + 6) = *((_OWORD *)v39 + 6);
v38 += 128;
v41 = *((_OWORD *)v39 + 7);
v39 += 128;
*((_OWORD *)v38 - 1) = v41;
--v40;
}
while( v40 );
v35 += 972;
v36 += 972;
++i;
*(_OWORD *)v38 = *(_OWORD *)v39;
*((_OWORD *)v38 + 1) = *((_OWORD *)v39 + 1);
*((_OWORD *)v38 + 2) = *((_OWORD *)v39 + 2);
*((_OWORD *)v38 + 3) = *((_OWORD *)v39 + 3);
*((_QWORD *)v38 + 8) = *((_QWORD *)v39 + 8);
*((_DWORD *)v38 + 18) = *((_DWORD *)v39 + 18);
}
*((_DWORD *)Buffer + 1) = i;
*((_DWORD *)Buffer + 2) = v36;
}
LABEL_44:
*(_DWORD *)BytesUsed = v10;
return v11;
}Referenced by:
No references.