HalpIommuTraceFault

char HalpIommuTraceFault(__int64 a1, __int64 a2, EVENT_DESCRIPTOR *a3, ...){
  void **v3; 
  void **v4; 
  UINT64 v5; 
  UINT64 UserDataCount; 
  struct _EVENT_DATA_DESCRIPTOR UserData; 
  __int64 *v9; 
  int v10; 
  int v11; 
  int *v12; 
  int v13; 
  int v14; 
  va_list v15; 
  int v16; 
  int v17; 
  void *retaddr; 
  void *v19; 
  void *v20; 
  int v21; 
  void *v22; 
  va_list va; 
  va_list va1; 
  va_start(va1, a3);
  va_start(va, a3);
  v22 = va_arg(va1, void *);
  v3 = &retaddr;
  v21 = (int)a3;
  v20 = (void *)a2;
  v19 = (void *)a1;
  if( HalpDiagnosticEventsRegistered )
  {
    v5 = HalpDiagnosticEventHandle;
    LOBYTE(v3) = EtwEventEnabled(HalpDiagnosticEventHandle, (EVENT_DESCRIPTOR *)&HAL_ETW_EVENT_IOMMU_FAULT, a3);
    if( (_BYTE)v3 )
    {
      UserData.Reserved = 0;
      v11 = 0;
      v14 = 0;
      v17 = 0;
      UserData.Ptr = (unsigned __int64)&v19;
      v9 = (__int64 *)&v20;
      v12 = &v21;
      UserData.Size = 8;
      va_copy(v15, va);
      LODWORD(UserDataCount) = 4;
      v10 = 8;
      v13 = 4;
      v16 = 8;
      LOBYTE(v3) = EtwWriteEx(
                     v5,
                     (EVENT_DESCRIPTOR *)&HAL_ETW_EVENT_IOMMU_FAULT,
                     0i64,
                     0i64,
                     0i64,
                     0i64,
                     UserDataCount,
                     &UserData);
    }
  }
  else if( !HalpIommuGlobalEventBuffer )
  {
    v3 = (void **)HalpMmAllocCtxAlloc(a1, 32i64);
    HalpIommuGlobalEventBuffer = (__int64)v3;
    v4 = v3;
    if( v3 )
    {
      *(_OWORD *)v3 = 0i64;
      *((_OWORD *)v3 + 1) = 0i64;
      *v3 = v19;
      v3[1] = v20;
      *((_DWORD *)v3 + 4) = v21;
      LOBYTE(v3) = (_BYTE)v22;
      v4[3] = v22;
    }
  }
  return(char)v3;
}

Referenced by:

HalpIommuReportIommuFault