HalpInterruptDestinationToTarget
__int64 __fastcall HalpInterruptDestinationToTarget(__int64 a1, __int64 a2, __int64 a3){
unsigned int v3;
__int64 *v5;
unsigned __int8 v6;
__int64 v7;
unsigned int ProcessorIndexFromNumber;
__int64 v9;
__int64 v10;
int v11;
__int64 v13;
__int64 v14;
__int64 ProcNumber;
ProcNumber = a1;
v3 = 0;
*(_DWORD *)a3 = 0;
switch( *(_DWORD *)a2 )
{
case 1:
v5 = *(__int64 **)(a2 + 8);
v6 = 0;
LODWORD(ProcNumber) = 0;
v7 = *v5;
LOWORD(ProcNumber) = *((_WORD *)v5 + 4);
while( 1 )
{
if( !v7 )
return v3;
if( _bittest64(&v7, v6) )
{
v7 &= ~(1i64 << v6);
ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber((UINT16 *)&ProcNumber);
v9 = qword_140C50630;
v10 = 3i64 * ProcessorIndexFromNumber;
v11 = *(_DWORD *)(qword_140C50630 + 24i64 * ProcessorIndexFromNumber);
switch( v11 )
{
case 4:
*(_DWORD *)a3 = 4;
goto LABEL_9;
case 5:
if( *(_DWORD *)a3 != 5 )
{
*(_DWORD *)a3 = 5;
LABEL_9:
*(_DWORD *)(a3 + 8) = *(_DWORD *)(v9 + 8 * v10 + 8);
break;
}
*(_DWORD *)(a3 + 8) |= *(_DWORD *)(qword_140C50630 + 8 * v10 + 8);
break;
case 6:
if( *(_DWORD *)a3 == 6 && *(_DWORD *)(a3 + 8) == *(_DWORD *)(qword_140C50630 + 8 * v10 + 8) )
{
*(_DWORD *)(a3 + 12) |= *(_DWORD *)(qword_140C50630 + 8 * v10 + 12);
}
else
{
*(_DWORD *)a3 = 6;
*(_DWORD *)(a3 + 8) = *(_DWORD *)(v9 + 8 * v10 + 8);
*(_DWORD *)(a3 + 12) = *(_DWORD *)(v9 + 8 * v10 + 12);
}
break;
default:
*(_DWORD *)a3 = 3;
break;
}
}
BYTE2(ProcNumber) = ++v6;
}
case 3:
*(_DWORD *)a3 = 1;
break;
case 4:
*(_DWORD *)a3 = 2;
break;
case 5:
*(_DWORD *)a3 = 3;
break;
case 6:
v13 = 3i64 * *(unsigned int *)(a2 + 8);
v14 = qword_140C50630;
*(_OWORD *)a3 = *(_OWORD *)(qword_140C50630 + 24i64 * *(unsigned int *)(a2 + 8));
*(_QWORD *)(a3 + 16) = *(_QWORD *)(v14 + 8 * v13 + 16);
break;
default:
return(unsigned int)-1073741811;
}
return v3;
}Referenced by:
HalpInterruptEnableNmi
HalpInterruptGenerateMessage
HalpInterruptRemap
HalpInterruptSetDestinationInternal
HalpInterruptSetLineState
HalpInterruptSetRemappedDestination