HalpApicInitializeIoUnit

NTSTATUS __stdcall HalpApicInitializeIoUnit(INT64 a1){
  UINT8 v1; 
  _DWORD *v2; 
  UINT64 v4; 
  int v5; 
  int v6; 
  unsigned int v7; 
  int v8; 
  INT64 v9; 
  NTSTATUS result; 
  UINT64 v11; 
  INT64 v12[2]; 
  __int128 v13; 
  __int128 v14; 
  __int64 v15; 
  _INTERRUPT_LINE v16; 

  v16 = 0i64;
  v2 = *(_DWORD **)(a1 + 16);
  *(_OWORD *)v12 = 0i64;
  v13 = 0i64;
  v14 = 0i64;
  v15 = 0i64;
  if( !v2 )
  {
    v4 = HalMapIoSpace(*(_LARGE_INTEGER *)a1, 0x1000ui64, MmNonCached, v1);
    *(_QWORD *)(a1 + 16) = v4;
    v2 = (_DWORD *)v4;
    if( !v4 )
      return -1073741670;
  }
  *v2 = 1;
  v2[4] = 0;
  *v2 = 1;
  v5 = v2[4];
  *v2 = 1;
  v2[4] = 0;
  *v2 = 1;
  v6 = v2[4];
  if( (unsigned int)(v5 - 1) > 0xFFFFFFFD || (_BYTE)v5 != (_BYTE)v6 || BYTE2(v5) != BYTE2(v6) )
  {
    *(_BYTE *)(a1 + 40) = 1;
    return 0;
  }
  *(_BYTE *)(a1 + 24) = v5;
  *(_BYTE *)(a1 + 25) = BYTE2(v5) + 1;
  *v2 = 0;
  v2[4] |= *(_DWORD *)(a1 + 8) << 24;
  if( *(_BYTE *)(a1 + 26) || (result = HalpApicDescribeLines(a1), result >= 0) )
  {
    v7 = 0;
    if( *(_BYTE *)(a1 + 25) )
    {
      v8 = 17;
      do
      {
        *v2 = v8 - 1;
        v9 = (unsigned int)v2[4];
        if( *(_BYTE *)(a1 + 26)
          || (v2[4] & 0x700) != 512
          || (v9 & 0x10000) != 0
          || (*v2 = v8,
              v11 = (unsigned int)v2[4],
              v16.UnitId = *(_DWORD *)(a1 + 8),
              v16.Line = v7,
              HalpApicConvertFromRte(v9, v11, (INT64)v12),
              DWORD2(v13) == 7) )
        {
          v2[4] = 65791;
          *v2 = v8;
          v2[4] = 0;
        }
        else
        {
          result = HalFixInterruptLine(&v16, (INT128 *)v12);
          if( result < 0 )
            return result;
        }
        ++v7;
        v8 += 2;
      }
      while( v7 < *(unsigned __int8 *)(a1 + 25) );
    }
    *(_BYTE *)(a1 + 26) = 1;
    return 0;
  }
  return result;
}

Referenced by:

No references.