HalpInterruptRemapFixedLines
NTSTATUS __stdcall HalpInterruptRemapFixedLines(){
int v0;
PVOID *v2;
PVOID *v3;
PVOID *v4;
PVOID *v5;
INT64 v6;
int v7;
__int64 v8;
__int64 v9;
INT64 v10;
bool v11;
__int64 v12;
__int64 v13;
int v14;
unsigned __int8 v15;
UINT64 IrtIndex;
int v17;
_INTERRUPT_LINE Line;
v0 = 0;
LODWORD(IrtIndex) = 0;
Line = 0i64;
if( !*(&stru_140CF2E80 + 1860) || (*(_DWORD *)(Controller + 220) & 0x100) == 0 && !qword_140C4A168 )
return v0;
v2 = (PVOID *)qword_140C4B850;
v14 = 0;
while( 1 )
{
LABEL_22:
if( v2 == &qword_140C4B850 )
return v0;
v3 = v2;
v2 = (PVOID *)*v2;
if( *((_DWORD *)v3 + 54) == 2 )
{
v4 = (PVOID *)v3[30];
if( v4 != v3 + 30 )
break;
}
}
while( 1 )
{
v5 = v4;
v4 = (PVOID *)*v4;
if( *((_DWORD *)v5 + 8) == 2 )
{
v6 = 0i64;
v7 = *((_DWORD *)v5 + 6) - *((_DWORD *)v5 + 5);
v17 = 0;
if( v7 > 0 )
break;
}
LABEL_21:
if( v4 == v3 + 30 )
goto LABEL_22;
}
v8 = 0i64;
v13 = 0i64;
v12 = 0i64;
v9 = 0i64;
while( 1 )
{
if( !*((_BYTE *)v5[6] + v8) )
goto LABEL_20;
Line.UnitId = *((_DWORD *)v3 + 58);
Line.Line = v6 + *((_DWORD *)v5 + 5);
v10 = (INT64)v5[5] + v9;
if( (*(_DWORD *)(Controller + 220) & 0x100) != 0 )
break;
LABEL_15:
if( qword_140C4A168 )
{
v0 = HalpHvMapDeviceInterrupt(*((_DWORD *)v3 + 58), v6, v10, 0i64);
if( v0 < 0 )
{
*((_DWORD *)v3 + 78) = 1825;
goto LABEL_25;
}
}
v15 = HalpAcquireHighLevelLock(&qword_140C49C40);
v0 = HalpInterruptSetLineStateInternal((_REGISTERED_INTERRUPT_CONTROLLER *)v3, &Line, (_INTERRUPT_LINE_STATE *)v10);
KxReleaseSpinLock(&qword_140C49C40);
__writecr8(v15);
if( v0 < 0 )
return v0;
LODWORD(v6) = v17;
v8 = v12;
v9 = v13;
LABEL_20:
v6 = (unsigned int)(v6 + 1);
v12 = v8 + 16;
v9 += 56i64;
v11 = (int)v6 < *((_DWORD *)v5 + 6) - *((_DWORD *)v5 + 5);
v17 = v6;
v8 += 16i64;
v13 = v9;
if( !v11 )
goto LABEL_21;
}
v0 = HalpIrtAllocateIndex(&IrtIndex, 1i64);
if( v0 >= 0 )
{
v14 ^= (IrtIndex ^ v14) & 0x3FFFFFFF;
HalpIommuUpdateRemappingTableEntry(0, v14 & 0x3FFFFFFF, v10);
*(_DWORD *)(v10 + 24) = 7;
*(_DWORD *)(v10 + 32) = v14 & 0x3FFFFFFF;
goto LABEL_15;
}
*((_DWORD *)v3 + 78) = 1796;
LABEL_25:
*((_DWORD *)v3 + 74) = v0;
*(&CmpDummyThreadEvent + 1789) = 31;
*((_DWORD *)v3 + 73) = 31;
v3[38] = (PVOID)"minkernel\\hals\\lib\\interrupts\\common\\intrupt.c";
return v0;
}Referenced by:
HalpInitializeInterruptsBspLate