WheapReportBootError

UINT8 __stdcall WheapReportBootError(_WHEA_ERROR_PACKET_V2 *BootPacket){
  INT64 v1; 
  UINT64 v2; 
  void *WheaInfo; 
  _WHEAP_ERROR_SOURCE *ErrorSource; 
  INT64 v6; 
  _WHEAP_ERROR_RECORD_WRAPPER *v7; 
  void(__fastcall *v8)(INT64, _WHEA_ERROR_PACKET_V2 *, _WHEA_ERROR_RECORD *, _QWORD, _QWORD); 
  UINT64 RecordLength; 

  WheaInfo = KeGetPcr()->Prcb.WheaInfo;
  if( !WheaInfo )
    return 0;
  ErrorSource = WheapGetErrorSource(*((_WHEAP_ERROR_SOURCE_TABLE **)WheaInfo + 1), BootPacket->ErrorSourceId, v1, v2);
  v6 = (INT64)ErrorSource;
  if( !ErrorSource )
    return 0;
  _InterlockedIncrement(&ErrorSource->ErrorCount);
  LODWORD(RecordLength) = 0;
  v7 = WheapAllocErrorRecord(ErrorSource, &RecordLength);
  if( !v7 )
    return 0;
  LODWORD(v8) = WheapGetErrorSourceFunction(v6, 2i64, 0);
  if( v8 )
    v8(v6 + 96, BootPacket, &v7->ErrorRecord, (unsigned int)(RecordLength - 40), *(_QWORD *)(v6 + 56));
  _InterlockedDecrement((volatile signed __int32 *)(v6 + 92));
  WheapCompressErrorRecord(3ui64, &v7->ErrorRecord);
  WheapWorkQueueAddItem(*((_WHEAP_WORK_QUEUE **)WheaInfo + 2), &v7->WorkEntry);
  return 1;
}

Referenced by:

WheapCheckForAndReportErrorsFromPreviousSession