WheapAllocErrorRecord

_WHEAP_ERROR_RECORD_WRAPPER *__stdcall WheapAllocErrorRecord(_WHEAP_ERROR_SOURCE *ErrSrc, UINT64 *RecordLength){
  unsigned int v4; 
  VOID **PoolWithTag; 
  _WHEAP_ERROR_RECORD_WRAPPER *v6; 
  size_t v7; 
  _WHEAP_ERROR_RECORD_WRAPPER *PreallocatedErrorRecord; 

  v4 = ErrSrc->RecordLength;
  *(_DWORD *)RecordLength = v4;
  if( KeGetCurrentIrql() > 2u )
  {
    PreallocatedErrorRecord = WheapGetPreallocatedErrorRecord(ErrSrc);
    v6 = PreallocatedErrorRecord;
    if( PreallocatedErrorRecord )
    {
      PreallocatedErrorRecord->Flags.AsULONG = 1;
      goto LABEL_6;
    }
LABEL_7:
    *(_DWORD *)RecordLength = 0;
    return v6;
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v4, ErrSrc->PoolTag);
  v6 = (_WHEAP_ERROR_RECORD_WRAPPER *)PoolWithTag;
  if( !PoolWithTag )
    goto LABEL_7;
  v7 = *(_DWORD *)RecordLength;
  memset(PoolWithTag, 0i64, v7);
  WheapInitializeErrorRecordWrapper(v6, v7, ErrSrc);
LABEL_6:
  v6->ErrorSource = ErrSrc;
  return v6;
}

Referenced by:

WheaReportHwError
WheapReportBootError