HalpInterruptGenerateMessage
__int64 __fastcall HalpInterruptGenerateMessage(__int64 a1, __int64 a2, _QWORD *a3, _QWORD *a4){
INT64 v4;
int v6;
char v7;
__int64 v11;
int ProcessorIdByNtNumber;
int v13;
__int64 result;
int v15;
UINT64 v16;
_DWORD *v17;
__int128 v18;
__int128 v19;
UINT64 Id[2];
__int64 v21;
v4 = Controller;
*a3 = 0i64;
*a4 = 0i64;
v6 = *(_DWORD *)a1;
v7 = 0;
v21 = 0i64;
v18 = 0i64;
v19 = 0i64;
*(_OWORD *)Id = 0i64;
v11 = (unsigned int)(v6 - 1);
if( (_DWORD)v11 )
{
v15 = v11 - 2;
if( !v15 )
{
DWORD2(v19) = 1;
goto LABEL_4;
}
if( v15 != 3 )
return 3221225659i64;
v16 = *(unsigned int *)(a1 + 8);
v7 = 1;
DWORD2(v19) = 4;
ProcessorIdByNtNumber = HalGetProcessorIdByNtNumber(v16, Id);
}
else
{
ProcessorIdByNtNumber = HalpInterruptDestinationToTarget(v11, a1, (__int64)&v19 + 8);
}
if( ProcessorIdByNtNumber < 0 )
{
*(&CmpDummyThreadEvent + 1789) = 21;
return 3221225485i64;
}
LABEL_4:
v13 = 16;
LODWORD(v18) = 2;
DWORD2(v18) = 1;
DWORD1(v19) = 1;
if( !v7 )
v13 = 18;
LODWORD(v19) = -1;
HIDWORD(v18) = v13;
LODWORD(v21) = *(_DWORD *)(a2 + 4);
if( (*(_DWORD *)(v4 + 220) & 0x100) != 0 )
{
v17 = *(_DWORD **)(a1 + 16);
if( (*v17 & 0x3FFFFFFF) != 1073741822 )
{
DWORD2(v19) = 7;
LODWORD(Id[0]) = *v17 & 0x3FFFFFFF;
}
}
result = 3221225659i64;
if( *(_QWORD *)(v4 + 136)
&& (result = (*(__int64(__fastcall **)(_QWORD, __int128 *, _QWORD *, _QWORD *))(v4 + 136))(
*(_QWORD *)(v4 + 16),
&v18,
a3,
a4),
(int)result >= 0) )
{
if( (((-(__int64)(*(&stru_140CF2E80 + 7328) != 0) & 0xFF00000100000000ui64) - 0x100000000i64) & *a3) != 0 )
return 3221226528i64;
else
return(*a4 & 0xFFFFFFFFFFFF0000ui64) != 0 ? 0xC0000420 : 0;
}
else
{
*(_DWORD *)(v4 + 296) = result;
*(&CmpDummyThreadEvent + 1789) = 8;
*(_DWORD *)(v4 + 292) = 8;
*(_QWORD *)(v4 + 304) = "minkernel\\hals\\lib\\interrupts\\common\\connect.c";
*(_DWORD *)(v4 + 312) = 2041;
}
return result;
}Referenced by:
HalpIommuConfigureInterrupt
HalpPopulateMsiMessages