WheaReportHwError

NTSTATUS __stdcall WheaReportHwError(_WHEA_ERROR_PACKET_V2 *ErrPkt){
  NTSTATUS v1; 
  int ErrorSeverity; 
  char v4; 
  __int64 v6; 
  INT64 v7; 
  INT64 *ErrorSource; 
  unsigned int v9; 
  INT64 v10; 
  INT64 v11; 
  ULONG_PTR v12; 
  _WHEA_ERROR_SEVERITY v13; 
  INT64 enabled; 
  char v15; 
  char v16[12]; 
  __int128 Src; 
  __int128 v18; 
  _WHEA_ERROR_PACKET_V2 *v19; 
  int v20[10]; 
  v1 = 0;
  v19 = 0i64;
  memset(v16, 0, sizeof(v16));
  v15 = 0;
  ErrorSeverity = ErrPkt->ErrorSeverity;
  v4 = 0;
  Src = 0i64;
  v18 = 0i64;
  if( (ErrorSeverity & 0xC0000000) == -1073741824 )
    return -1073741811;
  if( (ErrorSeverity & 0x40000000) != 0 )
  {
    v15 = 1;
    ErrorSeverity &= ~0x40000000u;
    *(_QWORD *)&v16[4] = ((unsigned __int64)&ErrPkt->Version + ErrPkt->Length + 3) & 0xFFFFFFFFFFFFFFF8ui64;
LABEL_7:
    ErrPkt->ErrorSeverity = ErrorSeverity;
    goto LABEL_8;
  }
  if( ErrorSeverity < 0 )
  {
    ErrorSeverity &= ~0x80000000;
    v4 = 1;
    goto LABEL_7;
  }
LABEL_8:
  if( ErrorSeverity == 3 && !v4 )
    return 0;
  LODWORD(enabled) = 1;
  wil_details_FeatureReporting_ReportUsageToService(
    &Feature_LogErrorRecords__private_reporting,
    0x11B4117ui64,
    0i64,
    0i64,
    (FEATURE_LOGGED_TRAITS *)&Feature_LogErrorRecords_logged_traits,
    enabled);
  if( !v4 && ErrPkt->ErrorSeverity != WheaErrSevCorrected && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
  {
    *(_QWORD *)&Src = 0x1674C6857i64;
    *((_QWORD *)&Src + 1) = 40i64;
    *(_QWORD *)&v18 = 0x800000054C4E524Bui64;
    *((_QWORD *)&v18 + 1) = 0x800000008i64;
    v19 = ErrPkt;
    WheaLogInternalEvent(&Src);
  }
  v6 = *((_QWORD *)KeGetPcr() + 4244);
  if( !v6 || (v7 = *(_QWORD *)(v6 + 8)) == 0 || !*(_DWORD *)(v7 + 4) )
  {
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
      KeBugCheckEx(0x124u, ErrPkt->ErrorSourceType, 0i64, 0i64, 0i64);
    return 0;
  }
  ErrorSource = WheapGetErrorSource(v7, ErrPkt->ErrorSourceId);
  v10 = (INT64)ErrorSource;
  if( !ErrorSource )
  {
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 )
      KeBugCheckEx(0x122u, 9ui64, ErrPkt->ErrorSourceType, v9, 0i64);
    return -1073741632;
  }
  _InterlockedAdd((volatile signed __int32 *)ErrorSource + 6, 1u);
  if( ErrPkt->ErrorSeverity == WheaErrSevCorrected && WheapApplyThresholdChecks((INT64)ErrorSource) )
  {
    v20[8] = ErrPkt->ErrorSourceType;
    v20[9] = ErrPkt->ErrorSourceId;
    v20[0] = 1733060695;
    v20[1] = 1;
    v20[2] = 40;
    v20[3] = 1;
    v20[5] = -2147483644;
    v20[4] = 1280201291;
    v20[6] = 2;
    v20[7] = 8;
    WheaLogInternalEvent(v20);
    return 0;
  }
  v11 = WheapAllocErrorRecord(v10, (UINT64 *)v16);
  v12 = v11;
  if( !v11 )
  {
    ++*(_DWORD *)(v10 + 16);
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 && !v4 )
      KeBugCheckEx(0x122u, 0xAui64, ErrPkt->ErrorSourceType, ErrPkt->ErrorSourceId, 0i64);
    return -1073741670;
  }
  *(_DWORD *)(v11 + 24) ^= (*(_DWORD *)(v11 + 24) ^ (ErrPkt->Flags.AsULONG >> 2)) & 4;
  *(_DWORD *)(v11 + 24) ^= ((unsigned __int8)*(_DWORD *)(v11 + 24) ^ (unsigned __int8)(ErrPkt->Flags.AsULONG >> 2)) & 8;
  *(_DWORD *)v16 = WheapFillOutErrorRecord((unsigned int)(*(_DWORD *)v16 - 40), (INT64)ErrPkt, v10, v11 + 40);
  if( *(int *)v16 >= 0 )
  {
    if( v4 || v15 )
      *(_DWORD *)(v12 + 144) |= 8u;
    if( (*(_DWORD *)(v12 + 144) & 2) != 0 )
    {
      WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
      goto LABEL_43;
    }
    if( !WheapPolicyIgnoreDummyWrite && !v4 )
    {
      WheapCompressErrorRecord(0i64, (WHEA_ERROR_RECORD *)(v12 + 40));
      if( (int)PshedWriteErrorRecord(1i64, *(unsigned int *)(v12 + 60), v12 + 40) < 0 )
        WheapPolicyIgnoreDummyWrite = 1;
    }
    v13 = ErrPkt->ErrorSeverity;
    if( v13 == WheaErrSevFatal )
    {
      if( !v4 )
      {
        PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
        WheapPersistPageForMemoryError(v12 + 40);
        WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
        PshedWriteErrorRecord(0i64, *(unsigned int *)(v12 + 60), v12 + 40);
        WheapAddToDumpFile((PVOID)(v12 + 40), *(unsigned int *)(v12 + 60));
        if( v15 )
          KeBugCheckEx(
            0x124u,
            *(int *)(v10 + 104),
            v12 + 40,
            *(_QWORD *)(*(_QWORD *)&v16[4] + 72i64),
            *(_QWORD *)(*(_QWORD *)&v16[4] + 80i64));
        goto LABEL_60;
      }
    }
    else if( (unsigned int)(v13 - 2) > 1 )
    {
      if( v13 )
      {
        WheapFreeErrorRecord(v12);
        return -1073741811;
      }
      PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
      WheapAttemptErrorRecovery((WHEA_ERROR_RECORD *)(v12 + 40));
      WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
      if( *(_DWORD *)(v12 + 52) == 2 )
      {
        *(_DWORD *)(v12 + 144) |= 1u;
      }
      else if( !v4 )
      {
        WheapPersistPageForMemoryError(v12 + 40);
        PshedWriteErrorRecord(0i64, *(unsigned int *)(v12 + 60), v12 + 40);
        WheapAddToDumpFile((PVOID)(v12 + 40), *(unsigned int *)(v12 + 60));
LABEL_60:
        PshedBugCheckSystem(v10 + 96, v12 + 40);
        return v1;
      }
LABEL_43:
      if( (*(_DWORD *)(v12 + 24) & 1) != 0 )
      {
        if( WheapEventingInitialized == 1 )
          WheapGenerateETWEvents((WHEA_ERROR_RECORD *)(v12 + 40));
        WheapFreeErrorRecord(v12);
        return v1;
      }
      goto LABEL_64;
    }
    PshedFinalizeErrorRecord(v12 + 40, v10 + 96);
    WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v12 + 40));
LABEL_64:
    WheapWorkQueueAddItem(*(_QWORD *)(v6 + 16), (LIST_ENTRY *)v12);
    return v1;
  }
  if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (*(_BYTE *)&ErrPkt->Flags.0 & 1) == 0 && !v4 )
    KeBugCheckEx(0x122u, 0xBui64, ErrPkt->ErrorSourceType, ErrPkt->ErrorSourceId, 0i64);
  WheapFreeErrorRecord(v12);
  return *(_DWORD *)v16;
}

Referenced by:

HalHandleNMI
HalpCheckAndReportGhes
HalpMcaReportError
WheaHwErrorReportSubmitDeviceDriver