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.