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