WheaReportHwError

NTSTATUS __stdcall WheaReportHwError(_WHEA_ERROR_PACKET_V2 *ErrPkt){
  NTSTATUS v1; 
  int ErrorSeverity; 
  char v4; 
  INT64 v6; 
  UINT64 v7; 
  void *WheaInfo; 
  __int64 v9; 
  _WHEAP_ERROR_SOURCE *ErrorSource; 
  _WHEA_ERROR_PACKET_V2 *v11; 
  INT64 v12; 
  _WHEAP_ERROR_RECORD_WRAPPER *v13; 
  _WHEAP_ERROR_RECORD_WRAPPER *v14; 
  _WHEA_ERROR_SEVERITY v15; 
  INT64 enabled; 
  char v17; 
  char RecordLength[12]; 
  __int128 Src; 
  __int128 v20; 
  _WHEA_ERROR_PACKET_V2 *v21; 
  int v22[10]; 

  v1 = 0;
  v21 = 0i64;
  memset(RecordLength, 0, sizeof(RecordLength));
  v17 = 0;
  ErrorSeverity = ErrPkt->ErrorSeverity;
  v4 = 0;
  Src = 0i64;
  v20 = 0i64;
  if( (ErrorSeverity & 0xC0000000) == -1073741824 )
    return -1073741811;
  if( (ErrorSeverity & 0x40000000) != 0 )
  {
    v17 = 1;
    ErrorSeverity &= ~0x40000000u;
    *(_QWORD *)&RecordLength[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(
    (wil_details_FeatureReportingCache *)&stru_140CF2E80 + 826,
    0x11B4117ui64,
    0i64,
    0i64,
    (FEATURE_LOGGED_TRAITS *)&Feature_LogErrorRecords_logged_traits,
    enabled);
  if( !v4 && ErrPkt->ErrorSeverity != WheaErrSevCorrected && (ErrPkt->Flags._bf_0 & 1) == 0 )
  {
    *(_QWORD *)&Src = 0x1674C6857i64;
    *((_QWORD *)&Src + 1) = 40i64;
    *(_QWORD *)&v20 = 0x800000054C4E524Bui64;
    *((_QWORD *)&v20 + 1) = 0x800000008i64;
    v21 = ErrPkt;
    WheaLogInternalEvent(&Src);
  }
  WheaInfo = KeGetPcr()->Prcb.WheaInfo;
  if( !WheaInfo || (v9 = *((_QWORD *)WheaInfo + 1)) == 0 || !*(_DWORD *)(v9 + 4) )
  {
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 )
      KeBugCheckEx(0x124u, (PVOID)(int)ErrPkt->ErrorSourceType, 0i64, 0i64, 0i64);
    return 0;
  }
  ErrorSource = WheapGetErrorSource((_WHEAP_ERROR_SOURCE_TABLE *)v9, ErrPkt->ErrorSourceId, v6, v7);
  v12 = (INT64)ErrorSource;
  if( !ErrorSource )
  {
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 )
      KeBugCheckEx(0x122u, (PVOID)9, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)(unsigned int)v11, 0i64);
    return -1073741632;
  }
  _InterlockedAdd(&ErrorSource->ErrorCount, 1u);
  if( ErrPkt->ErrorSeverity == WheaErrSevCorrected && (unsigned __int8)WheapApplyThresholdChecks(ErrorSource, v11) )
  {
    v22[8] = ErrPkt->ErrorSourceType;
    v22[9] = ErrPkt->ErrorSourceId;
    v22[0] = 1733060695;
    v22[1] = 1;
    v22[2] = 40;
    v22[3] = 1;
    v22[5] = -2147483644;
    v22[4] = 1280201291;
    v22[6] = 2;
    v22[7] = 8;
    WheaLogInternalEvent(v22);
    return 0;
  }
  v13 = WheapAllocErrorRecord((_WHEAP_ERROR_SOURCE *)v12, (UINT64 *)RecordLength);
  v14 = v13;
  if( !v13 )
  {
    ++*(_DWORD *)(v12 + 16);
    if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 && !v4 )
      KeBugCheckEx(0x122u, (PVOID)0xA, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)ErrPkt->ErrorSourceId, 0i64);
    return -1073741670;
  }
  v13->Flags.AsULONG ^= (v13->Flags.AsULONG ^ ((unsigned __int32)ErrPkt->Flags._bf_0 >> 2)) & 4;
  v13->Flags.AsULONG ^= ((unsigned __int8)v13->Flags.AsULONG ^ (unsigned __int8)((unsigned __int32)ErrPkt->Flags._bf_0 >> 2)) & 8;
  *(_DWORD *)RecordLength = WheapFillOutErrorRecord(
                              (unsigned int)(*(_DWORD *)RecordLength - 40),
                              (INT64)ErrPkt,
                              v12,
                              (INT64)&v13->ErrorRecord);
  if( *(int *)RecordLength >= 0 )
  {
    if( v4 || v17 )
      v14->ErrorRecord.Header.Flags.AsULONG |= 8u;
    if( (v14->ErrorRecord.Header.Flags.AsULONG & 2) != 0 )
    {
      WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
      goto LABEL_43;
    }
    if( !WheapPolicyIgnoreDummyWrite && !v4 )
    {
      WheapCompressErrorRecord(0i64, &v14->ErrorRecord);
      if( (int)PshedWriteErrorRecord(1i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord) < 0 )
        WheapPolicyIgnoreDummyWrite = 1;
    }
    v15 = ErrPkt->ErrorSeverity;
    if( v15 == WheaErrSevFatal )
    {
      if( !v4 )
      {
        PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
        WheapPersistPageForMemoryError((INT64)&v14->ErrorRecord);
        WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
        PshedWriteErrorRecord(0i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord);
        WheapAddToDumpFile(&v14->ErrorRecord, v14->ErrorRecord.Header.Length);
        if( v17 )
          KeBugCheckEx(
            0x124u,
            (PVOID)*(int *)(v12 + 104),
            &v14->ErrorRecord,
            *(PVOID *)(*(_QWORD *)&RecordLength[4] + 72i64),
            *(PVOID *)(*(_QWORD *)&RecordLength[4] + 80i64));
        goto LABEL_60;
      }
    }
    else if( (unsigned int)(v15 - 2) > 1 )
    {
      if( v15 )
      {
        WheapFreeErrorRecord(v14);
        return -1073741811;
      }
      PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
      WheapAttemptErrorRecovery(&v14->ErrorRecord);
      WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
      if( v14->ErrorRecord.Header.Severity == WheaErrSevCorrected )
      {
        v14->ErrorRecord.Header.Flags.AsULONG |= 1u;
      }
      else if( !v4 )
      {
        WheapPersistPageForMemoryError((INT64)&v14->ErrorRecord);
        PshedWriteErrorRecord(0i64, v14->ErrorRecord.Header.Length, &v14->ErrorRecord);
        WheapAddToDumpFile(&v14->ErrorRecord, v14->ErrorRecord.Header.Length);
LABEL_60:
        PshedBugCheckSystem(v12 + 96, &v14->ErrorRecord);
        return v1;
      }
LABEL_43:
      if( (v14->Flags.AsULONG & 1) != 0 )
      {
        if( *(&WheapDeferredInternalLogsEventLock + 6) == 1 )
          WheapGenerateETWEvents(&v14->ErrorRecord);
        WheapFreeErrorRecord(v14);
        return v1;
      }
      goto LABEL_64;
    }
    PshedFinalizeErrorRecord(&v14->ErrorRecord, v12 + 96);
    WheapCompressErrorRecord(3ui64, &v14->ErrorRecord);
LABEL_64:
    WheapWorkQueueAddItem(*((_WHEAP_WORK_QUEUE **)WheaInfo + 2), &v14->WorkEntry);
    return v1;
  }
  if( ErrPkt->ErrorSeverity <= (unsigned int)WheaErrSevFatal && (ErrPkt->Flags._bf_0 & 1) == 0 && !v4 )
    KeBugCheckEx(0x122u, (PVOID)0xB, (PVOID)(int)ErrPkt->ErrorSourceType, (PVOID)ErrPkt->ErrorSourceId, 0i64);
  WheapFreeErrorRecord(v14);
  return *(_DWORD *)RecordLength;
}

Referenced by:

HalHandleNMI
HalpCheckAndReportGhes
HalpMcaReportError
WheaHwErrorReportSubmitDeviceDriver