IvtProcessDeviceExceptions

NTSTATUS __stdcall IvtProcessDeviceExceptions(INT64 a1){
  unsigned int *v2; 
  int v3; 
  unsigned int i; 
  INT64 *ExceptionList; 
  INT64 j; 
  UINT64 v7; 
  NTSTATUS result; 
  UINT64 v9; 
  INT64 v10; 
  UINT64 v11; 
  INT64 v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15[10]; 

  memset(v15, 0i64, sizeof(v15));
  v2 = *(unsigned int **)(a1 + 296);
  v3 = 0;
  for( i = 0; i < *v2; ++i )
  {
    v3 = HalpIvtpInitializeReservedDomain(a1, (INT64)&v2[4 * i + 2]);
    if( v3 < 0 )
      break;
    v2 = *(unsigned int **)(a1 + 296);
  }
  if( v3 >= 0 )
  {
    ExceptionList = HalpIommuGetExceptionList();
    for( j = *ExceptionList; (INT64 *)j != ExceptionList; j = *(_QWORD *)j )
    {
      if( *(_DWORD *)(j + 16) == *(_DWORD *)(a1 + 212) )
      {
        memset(v15, 0i64, sizeof(v15));
        v7 = *(_QWORD *)(j + 24);
        v15[0] = 1i64;
        result = IvtAllocateContextTable(a1, v7);
        v3 = result;
        if( result < 0 )
          return result;
        v11 = *(unsigned int *)(j + 24);
        if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
        {
          LODWORD(v14) = 1;
          IvtUpdateExtendedContextEntry(a1, v11, v9, v10, (INT64)v15, v13, v14, 0i64);
        }
        else
        {
          LODWORD(v12) = 1;
          IvtUpdateContextEntry(a1, v11, (INT64)v15, v10, v12, 0i64);
        }
      }
    }
  }
  return v3;
}

Referenced by:

IvtInitializeIommu