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