HalpInterruptSendIpi
__int64 __fastcall HalpInterruptSendIpi(_DWORD *a1, unsigned int a2){
int v4;
_KAFFINITY_EX *p_Affinity;
__int64 v6;
__int64(__fastcall *v7)(_QWORD, int *, __int128 *, _QWORD, int *);
__int64 result;
int v9;
unsigned int v10;
unsigned __int16 Count;
unsigned __int16 i;
__int64 v13;
__int64 v14;
__int16 v15;
unsigned __int64 v16;
unsigned __int16 v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
__int64 v21;
__int64(__fastcall *v22)(_QWORD, int *, __int128 *, _QWORD, int *);
int v23;
unsigned int *v24;
int v25;
unsigned __int64 Mask;
unsigned __int8 v27;
__int64(__fastcall *v28)(_QWORD, int *, __int128 *, _QWORD, int *);
int v29;
INT64 v30;
INT64 v31;
__int64 v32;
__int64 v33;
unsigned __int64 v34;
__int64(__fastcall *v35)(_QWORD, int *, __int128 *, _QWORD, int *);
int v36;
_PROCESSOR_NUMBER ProcNumber;
__int128 v38;
__int64 v39;
int v40[2];
int v41[2];
int v42[2];
int v43[2];
int v44[2];
int v45[2];
int v46[2];
int v47[2];
__int128 v48;
__int64 v49;
_GROUP_AFFINITY Result;
_KAFFINITY_EX Affinity;
unsigned __int16 v52;
__int16 v53[87];
int v54;
memset(&Affinity, 0i64, sizeof(Affinity));
v4 = *a1;
p_Affinity = &Affinity;
v49 = 0i64;
v48 = 0i64;
switch( v4 )
{
case 6:
v6 = 3i64 * (unsigned int)a1[2];
v48 = *(_OWORD *)(qword_140C50630 + 24i64 * (unsigned int)a1[2]);
v49 = *(_QWORD *)(qword_140C50630 + 8 * v6 + 16);
break;
case 2:
case 1:
p_Affinity = (_KAFFINITY_EX *)*((_QWORD *)a1 + 1);
if( v4 == 1 )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
v32 = LOWORD(p_Affinity->Bitmap[0]);
v33 = *(_QWORD *)&p_Affinity->Count;
if( (_WORD)v32 )
Affinity.Count = v32 + 1;
Affinity.Bitmap[v32] |= v33;
p_Affinity = &Affinity;
}
goto LABEL_7;
case 3:
if( (*(_DWORD *)(Controller + 220) & 0x10) == 0 || HalpInterruptNoShorthand )
{
KeCopyAffinityEx(&Affinity, &KeActiveProcessors);
goto LABEL_7;
}
LODWORD(v48) = 1;
break;
case 4:
if( (*(_DWORD *)(Controller + 220) & 0x20) != 0 && !HalpInterruptNoShorthand )
{
LODWORD(v48) = 2;
break;
}
KeCopyAffinityEx(&Affinity, &KeActiveProcessors);
LODWORD(v31) = KeGetPcr()->Prcb.Number;
KeRemoveProcessorAffinityEx(&Affinity.Count, v31);
LABEL_7:
Result = 0i64;
memset(v53, 0i64, 0xA6u);
v9 = 0;
v39 = 0i64;
v10 = 0;
v38 = 0i64;
if( qword_140C4A1E8 )
{
return(unsigned int)qword_140C4A1E8(p_Affinity, a2);
}
else
{
Count = dword_140C4B7A0.Count;
if( dword_140C4B7A0.Count >= p_Affinity->Count )
Count = p_Affinity->Count;
v52 = Count;
for( i = 0; i < v52; *(_QWORD *)&v53[4 * v13 + 3] = qword_140C4B7A8[v13] & p_Affinity->Bitmap[v13] )
v13 = i++;
v53[0] = 20;
*(_DWORD *)&v53[1] = 0;
if( i < 0x14u )
{
do
{
v14 = i++;
*(_QWORD *)&v53[4 * v14 + 3] = 0i64;
}
while( i < (unsigned int)v53[0] );
}
v15 = v54;
if( *(&CmpDummyThreadEvent + 7160) )
{
v24 = (unsigned int *)*(&stru_140CF2E80 + 808);
ProcNumber = 0;
if( *(&stru_140CF2E80 + 808) < *(&stru_140CF2E80 + 809) )
{
do
{
KeAndGroupAffinityEx(p_Affinity, (_GROUP_AFFINITY *)(v24 + 2), &Result);
if( v25 )
{
Mask = Result.Mask;
v27 = 0;
LODWORD(v38) = 6;
*((_QWORD *)&v38 + 1) = *v24;
ProcNumber.Group = Result.Group;
for( ProcNumber.Number = 0; Mask; ProcNumber.Number = v27 )
{
if( (Mask & 1) != 0 )
{
v9 |= *(_DWORD *)(qword_140C50630
+ 24i64 * (unsigned int)KeGetProcessorIndexFromNumber(&ProcNumber.Group)
+ 12);
HIDWORD(v38) = v9;
}
++v27;
Mask >>= 1;
}
v40[0] = -1;
v40[1] = 1;
v41[1] = *(_DWORD *)(qword_140C50700 + 20);
v41[0] = *(_DWORD *)(qword_140C50700 + 16);
v28 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
_disable();
v29 = v28(*(_QWORD *)(Controller + 16), v41, &v38, a2, v40);
v10 = v29;
if( (v15 & 0x200) != 0 )
_enable();
if( v29 < 0 )
return v10;
v9 = 0;
}
v24 += 6;
}
while( (unsigned __int64)v24 < *(&stru_140CF2E80 + 809) );
}
}
else if( !*(&stru_140CF2E80 + 6616) )
{
v16 = p_Affinity->Bitmap[0];
v17 = 0;
LODWORD(v38) = 5;
DWORD2(v38) = 0;
while( v16 )
{
LABEL_18:
_BitScanForward64(&v18, v16);
v16 &= ~(1i64 << v18);
v19 = (unsigned __int8)v18 + (v17 << 6);
if( *(_DWORD *)(qword_140C50630 + 24i64 * (unsigned int)KiProcessorNumberToIndexMappingTable[v19]) == 5 )
DWORD2(v38) |= *(_DWORD *)(qword_140C50630
+ 24i64 * (unsigned int)KiProcessorNumberToIndexMappingTable[v19]
+ 8);
}
while( ++v17 < p_Affinity->Count )
{
v16 = p_Affinity->Bitmap[v17];
if( v16 )
goto LABEL_18;
}
if( DWORD2(v38) )
{
v42[0] = -1;
v42[1] = 1;
v43[1] = *(_DWORD *)(qword_140C50700 + 20);
v43[0] = *(_DWORD *)(qword_140C50700 + 16);
v22 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
_disable();
v23 = v22(*(_QWORD *)(Controller + 16), v43, &v38, a2, v42);
v10 = v23;
if( (v15 & 0x200) != 0 )
_enable();
if( v23 < 0 )
return v10;
}
}
v20 = *(_QWORD *)&v53[3];
LOWORD(v21) = 0;
while( v20 )
{
LABEL_66:
_BitScanForward64(&v34, v20);
LODWORD(v38) = 4;
v20 &= ~(1i64 << v34);
DWORD2(v38) = *(_DWORD *)(qword_140C50630
+ 24i64
* (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v21
+ (unsigned __int8)v34]
+ 8);
v45[1] = *(_DWORD *)(qword_140C50700 + 20);
v45[0] = *(_DWORD *)(qword_140C50700 + 16);
v35 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
v44[0] = -1;
v44[1] = 1;
_disable();
v36 = v35(*(_QWORD *)(Controller + 16), v45, &v38, a2, v44);
v10 = v36;
if( (v15 & 0x200) != 0 )
_enable();
if( v36 < 0 )
return v10;
}
while( 1 )
{
v21 = (unsigned __int16)(v21 + 1);
if( (unsigned int)v21 >= v52 )
break;
v20 = *(_QWORD *)&v53[4 * v21 + 3];
if( v20 )
goto LABEL_66;
}
}
return v10;
case 5:
if( (*(_DWORD *)(Controller + 220) & 0x40) == 0 || HalpInterruptNoShorthand )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
LODWORD(v30) = KeGetPcr()->Prcb.Number;
KeAddProcessorAffinityEx(&Affinity.Count, v30);
goto LABEL_7;
}
LODWORD(v48) = 3;
break;
default:
return 3221225485i64;
}
v46[0] = -1;
v46[1] = 1;
v47[1] = *(_DWORD *)(qword_140C50700 + 20);
v47[0] = *(_DWORD *)(qword_140C50700 + 16);
v7 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
_disable();
result = v7(*(_QWORD *)(Controller + 16), v47, &v48, a2, v46);
if( (v54 & 0x200) != 0 )
_enable();
return result;
}Referenced by:
HalRequestDeferredRecoveryServiceInterrupt
HalRequestIpiSpecifyVector
HalSendSoftwareInterrupt
KiDeferredReadySingleThread
KiForwardTick
KiInsertQueueDpc