HsaProcessIvmd
NTSTATUS __fastcall HsaProcessIvmd(INT64 rcx0, UINT64 a2, _BYTE *a3, INT64 *a4){
INT64 v7;
int v8;
UINT64 i;
char v10;
char v11;
__int64 v12;
UINT64 v13;
unsigned __int16 v14;
UINT64 v15;
unsigned __int16 v16;
INT64 DeviceEntry;
__int64 v19[7];
v19[0] = 0i64;
if( ExtEnvAllocateMemory(rcx0, 0x18ui64, v19) < 0 )
return -1073741670;
v7 = v19[0];
*a4 = v19[0];
v8 = 0;
*a3 = 0;
*(_OWORD *)v7 = 0i64;
*(_QWORD *)(v7 + 16) = 0i64;
*(_QWORD *)(v7 + 16) = v7 + 8;
*(_QWORD *)(v7 + 8) = v7 + 8;
*(_DWORD *)v7 = 0;
for( i = rcx0 + *(unsigned __int16 *)(rcx0 + 2); ; i += *(unsigned __int16 *)(i + 2) )
{
if( i >= a2 )
return v8;
v10 = *(_BYTE *)i;
if( *(_BYTE *)i == *(_BYTE *)rcx0 )
break;
if( v10 == 32 )
{
*a3 = 1;
}
else if( (unsigned __int8)(v10 - 33) <= 1u )
{
if( *(_WORD *)(i + 2) != 32 )
return -1073741811;
v11 = *(_BYTE *)(i + 1);
if( (v11 & 8) != 0 || (v11 & 1) != 0 && (v11 & 6) != 0 )
{
v12 = *(_QWORD *)(i + 24);
if( !v12 )
return -1073741811;
v13 = *(_QWORD *)(i + 16);
if( v13 + v12 < v13 )
return -1073741811;
v14 = *(_WORD *)(i + 4);
v15 = v13 + v12 - 1;
v16 = v14;
if( v10 == 34 )
v16 = *(_WORD *)(i + 6);
while( v14 <= v16 )
{
DeviceEntry = IvmdFindDeviceEntry(v7, v14);
if( !DeviceEntry )
return -1073741670;
v8 = IvmdProcessRange(DeviceEntry, v13, v15);
if( v8 < 0 )
return -1073741670;
++v14;
}
}
}
}
return 0;
}Referenced by:
HalpIommuProcessIvhdEntry