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.