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