HalpInterruptUnmap
void __fastcall HalpInterruptUnmap(__int64 a1, __int64 a2, __int64 a3, __int64 a4, int *a5, UINT64 a6){
int *v6;
int *v7;
int v8;
int v9;
int v10;
INT64 v11;
INT64 v12;
INT64 *v13;
CHAR v14;
LARGE_INTEGER *v15;
KENLISTMENT *v16;
unsigned int v17;
ULONG_PTR *v18;
ULONG_PTR *Lines;
INT64 v20;
ULONG_PTR *v21;
_INTERRUPT_PROBLEM v22;
INT64 v23;
unsigned int v24;
_DWORD *v25;
__int64 v26;
_REGISTERED_INTERRUPT_CONTROLLER *v27;
int v28;
UINT64 SourceLine;
INT64 a3a[2];
__int128 v31;
__int128 v32;
__int64 v33;
v6 = a5;
v33 = 0i64;
*(_OWORD *)a3a = 0i64;
v7 = a5 + 1;
v8 = a5[3];
a3a[1] = (unsigned int)a5[4];
v9 = a5[1];
v31 = 0i64;
*(_QWORD *)&v31 = 0x1FFFFFFFFi64;
LODWORD(v33) = v9;
v10 = *a5;
LODWORD(a3a[0]) = v8;
v32 = 0i64;
if( v10 )
{
if( v10 == 3 )
{
if( HalpInterruptIsHvLineBasedIntRemappingSupported() )
HalpHvUnmapDeviceMsiRange(v12, v11, v13, v14);
if( (unsigned __int8)HalpInterruptIsRemappingRequired() )
{
v24 = a6;
if( (_DWORD)a6 )
{
v25 = v6 + 10;
v26 = (unsigned int)a6;
do
{
LODWORD(v33) = *v7;
HalpSetIrtEntry(1, v25, (INT64)a3a);
v25 += 22;
v7 += 22;
--v26;
}
while( v26 );
}
v16 = (KENLISTMENT *)(unsigned int)v6[10];
if( ((unsigned int)v16 & 0x40000000) == 0 )
HalpIrtFreeIndex((unsigned int)v16 & 0x3FFFFFFF, v24);
}
xHalUnmaskInterrupt(v16, v15);
return;
}
v22 = InterruptProblemBadConnectionData;
LODWORD(SourceLine) = 3219;
v23 = 2i64;
goto LABEL_24;
}
v17 = a5[14];
a5 = 0i64;
if( (int)HalpInterruptGsiToLine(v17, &a5) < 0 )
{
v23 = 0i64;
LODWORD(SourceLine) = 3133;
v22 = InterruptProblemNoSuchLines;
LABEL_24:
v27 = 0i64;
LABEL_26:
HalpInterruptSetProblemEx(v27, v22, v23, "minkernel\\hals\\lib\\interrupts\\common\\connect.c", SourceLine);
return;
}
if( (unsigned int)(v8 - 3) <= 1 )
{
LODWORD(a3a[1]) = 0;
BYTE4(a3a[0]) = 1;
}
v18 = HalpInterruptLookupController((int)a5);
if( !v18 )
{
v22 = InterruptProblemNoSuchController;
LODWORD(SourceLine) = 3165;
v23 = 1i64;
goto LABEL_24;
}
Lines = HalpInterruptFindLines((int *)&a5);
v21 = Lines;
if( !Lines )
{
v23 = 0i64;
LODWORD(SourceLine) = 3173;
v27 = (_REGISTERED_INTERRUPT_CONTROLLER *)v18;
v22 = InterruptProblemNoSuchLines;
goto LABEL_26;
}
if( qword_140C4A168 )
{
*(_DWORD *)(Lines[5] + 12) |= 0x10u;
HalpHvUnmapDeviceInterrupt(*((_DWORD *)v18 + 58), v20, Lines[5]);
*(_DWORD *)(v21[5] + 12) &= ~0x10u;
}
if( (unsigned __int8)HalpInterruptIsRemappingRequired() )
{
if( (unsigned int)HalpInterruptModel() == 1 )
{
LODWORD(v33) = *v7;
HalpSetIrtEntry(0, v6 + 10, (INT64)a3a);
v28 = v6[10];
if( (v28 & 0x40000000) == 0 )
HalpIrtFreeIndex(v28 & 0x3FFFFFFF, 1ui64);
}
}
*(_BYTE *)(v21[6] + 12) = 0;
}Referenced by:
HaliRemoveInterruptRemapping
HalpTimerUnmapInterrupt