HalpIommuHsaDiscover

INT64 __stdcall HalpIommuHsaDiscover(){
  _QWORD *v0; 
  _QWORD *v1; 
  _LARGE_INTEGER *Table; 
  __int64 v3; 
  INT64 result; 
  __int64 HighPart; 
  unsigned __int64 v6; 
  int v7; 
  bool v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  _BYTE *v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  _BYTE *v14; 
  char v15; 

  *v0 = 0i64;
  v1 = v0;
  *(&CmpDummyThreadEvent + 405) = (char *)&CmpDummyThreadEvent + 3232;
  *(&CmpDummyThreadEvent + 404) = (char *)&CmpDummyThreadEvent + 3232;
  v15 = 0;
  if( qword_140C49CB0 )
  {
    Table = HalpAcpiGetTable(qword_140C49CB0, (const UINT8 *)0x53525649, 0i64);
    v3 = (__int64)Table;
    if( Table )
    {
      HighPart = (unsigned int)Table->anonymous_0.HighPart;
      if( (unsigned int)HighPart >= 0x5A )
      {
        v6 = HighPart + v3;
        v7 = *(_DWORD *)(v3 + 36);
        if( (v7 & 1) != 0 )
        {
          if( (v7 & 2) != 0 )
          {
            v8 = 1;
            v9 = v3 + 48;
            while( v9 < v6 )
            {
              if( v9 + 4 > v6 )
                return 3221225485i64;
              v10 = *(unsigned __int16 *)(v9 + 2);
              if( (unsigned int)v10 < 4 || v9 + v10 > v6 )
                return 3221225485i64;
              v11 = (_BYTE *)v9;
              v9 += v10;
              if( *v11 == 64 )
              {
                HalpIommuProcessIvhdEntry(v3, (INT64)v11, &v15);
                if( (int)result < 0 )
                  return result;
                v8 = v8 && !v15;
              }
            }
          }
          else
          {
            v8 = 0;
          }
          v12 = v3 + 48;
          while( v12 < v6 )
          {
            if( v12 + 4 > v6 )
              return 3221225485i64;
            v13 = *(unsigned __int16 *)(v12 + 2);
            if( (unsigned int)v13 < 4 || v12 + v13 > v6 )
              return 3221225485i64;
            v14 = (_BYTE *)v12;
            v12 += v13;
            if( *v14 == 17 )
            {
              HalpIommuProcessIvhdEntry(v3, (INT64)v14, &v15);
              if( (int)result < 0 )
                return result;
              v8 = v8 && !v15;
            }
          }
          *v1 ^= (*(_DWORD *)v1 ^ (2 * v8)) & 2;
        }
      }
    }
  }
  return 0i64;
}

Referenced by:

HalpIommuRegisterBuiltinPlugins