WheapReportBootError

UINT8 __stdcall WheapReportBootError(_WHEA_ERROR_PACKET_V2 *BootPacket){
  __int64 v2; 
  INT64 *ErrorSource; 
  INT64 v4; 
  INT64 v5; 
  void(__fastcall *ErrorSourceFunction)(INT64, _WHEA_ERROR_PACKET_V2 *, INT64, _QWORD, _QWORD); 
  UINT64 v8; 
  v2 = *((_QWORD *)KeGetPcr() + 4244);
  if( !v2 )
    return 0;
  ErrorSource = WheapGetErrorSource(*(_QWORD *)(v2 + 8), BootPacket->ErrorSourceId);
  v4 = (INT64)ErrorSource;
  if( !ErrorSource )
    return 0;
  _InterlockedIncrement((volatile signed __int32 *)ErrorSource + 6);
  LODWORD(v8) = 0;
  v5 = WheapAllocErrorRecord((INT64)ErrorSource, &v8);
  if( !v5 )
    return 0;
  ErrorSourceFunction = (void(__fastcall *)(INT64, _WHEA_ERROR_PACKET_V2 *, INT64, _QWORD, _QWORD))WheapGetErrorSourceFunction(v4, 2i64, 0);
  if( ErrorSourceFunction )
    ErrorSourceFunction(v4 + 96, BootPacket, v5 + 40, (unsigned int)(v8 - 40), *(_QWORD *)(v4 + 56));
  _InterlockedDecrement((volatile signed __int32 *)(v4 + 92));
  WheapCompressErrorRecord(3ui64, (WHEA_ERROR_RECORD *)(v5 + 40));
  WheapWorkQueueAddItem(*(_QWORD *)(v2 + 16), (LIST_ENTRY *)v5);
  return 1;
}

Referenced by:

WheapCheckForAndReportErrorsFromPreviousSession