IopConnectInterrupt
__int64 __fastcall IopConnectInterrupt(
_QWORD *a1,
ULONG_PTR a2,
__int64 (__fastcall *a3)(__int64 a1, __int64 a2),
__int64 a4,
__int64 a5,
int a6,
__int64 a7,
char a8,
char a9,
__int64 a10,
__int64 a11){
GROUP_AFFINITY v13;
int v14;
unsigned __int64 v15;
unsigned __int64 v17;
char *PoolWithTag;
char *v19;
int v20;
__int64 v21;
char v22;
GROUP_AFFINITY v23;
__int64 v24;
unsigned __int8 v25;
_KINTERRUPT *Interrupt;
_KINTERRUPT *v27;
int v28;
__int64 v29;
char *v30;
unsigned __int64 v31;
_OWORD *v32;
_OWORD *v33;
__int64 v34;
__int128 v35;
_KINTERRUPT **v37;
__int16 *v38;
_WORD *v39;
PVOID *v40;
PVOID *v41;
__int64 v42;
_WORD *v43;
__int64 v44;
_WORD *v45;
__int64 v46;
struct _PROCESSOR_NUMBER ProcNumber;
int v48;
unsigned int Vector;
unsigned int Vector_4;
GROUP_AFFINITY GroupAffinity;
__int64 v52;
__int64 v53;
__int64 result[16];
bool v56;
char v57;
unsigned __int8 a1a;
memset((INT64)result, 0i64);
*a1 = 0i64;
ProcNumber = 0;
IopInitializeActiveConnectBlock(a11, result);
v13 = *(GROUP_AFFINITY *)(a11 + 32);
v14 = *(_DWORD *)(a11 + 24);
Vector = *(_DWORD *)(a11 + 12);
GroupAffinity = v13;
v48 = v14;
v15 = v13.Mask & KeActiveProcessors.Bitmap[(unsigned __int16)_mm_extract_epi16((__m128i)v13, 4)];
GroupAffinity.Mask = v15;
if( !*(_DWORD *)(a11 + 8)
&& !((unsigned __int8(__fastcall *)(_QWORD, _QWORD))off_140C00780[0])(0i64, *(unsigned int *)(a11 + 64))
&& (unsigned int)(*(_DWORD *)(a11 + 20) - 3) <= 1 )
{
v48 = 0;
}
v56 = a8 == 0;
if( KeVerifyGroupAffinity(&GroupAffinity, 0)
&& (v17 = (0x101010101010101i64
* ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56,
(_BYTE)v17) )
{
PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)(8 * (char)v17 + 496), 0x6E696F49ui64);
v19 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
KeInitializeDpc((PRKDPC)(v19 + 432), 0i64, 0i64);
v20 = v48;
*((_OWORD *)v19 + 1) = *(_OWORD *)a11;
v21 = (__int64)v19;
v22 = 0;
*((_OWORD *)v19 + 2) = *(_OWORD *)(a11 + 16);
ProcNumber.Reserved = 0;
*((_OWORD *)v19 + 3) = *(_OWORD *)(a11 + 32);
*((_OWORD *)v19 + 4) = *(_OWORD *)(a11 + 48);
*((_OWORD *)v19 + 5) = *(_OWORD *)(a11 + 64);
v23 = GroupAffinity;
*((_OWORD *)v19 + 6) = *(_OWORD *)(a11 + 80);
*((_DWORD *)v19 + 10) = v20;
*((GROUP_AFFINITY *)v19 + 3) = v23;
if( a7 )
v21 = a7;
*((_QWORD *)v19 + 1) = v15;
v19[400] = v56;
v24 = (__int64)(v19 + 408);
if( a8 )
v24 = 0i64;
v53 = v21;
v52 = v24;
v25 = 0;
v57 = 0;
a1a = 0;
ProcNumber.Group = _mm_extract_epi16((__m128i)v23, 4);
if( (char)v17 > 0 )
{
do
{
if( _bittest64((const __int64 *)&v15, v25) )
{
ProcNumber.Number = v25;
Vector_4 = KeGetProcessorIndexFromNumber(&ProcNumber);
Interrupt = KeAllocateInterrupt(*(&KiProcessorBlock + Vector_4));
v27 = Interrupt;
if( !Interrupt )
{
v28 = -1073741670;
goto LABEL_33;
}
memset((INT64)Interrupt, 0i64);
KeInitializeInterruptEx();
v25 = a1a;
*(_QWORD *)&v19[8 * v57 + 496] = v27;
v22 = ++v57;
}
a1a = ++v25;
}
while( v22 < (char)v17 );
}
if( !a8 )
{
v28 = IopAllocatePassiveInterruptBlock((_DWORD *)v19 + 4, &GroupAffinity);
if( v28 < 0 )
goto LABEL_33;
}
IopAcquireActiveConnectLock((INT64)result);
v28 = KeConnectInterrupt((_KINTERRUPT **)v19 + 62, v17, (_INTERRUPT_CONNECTION_DATA *)(v19 + 16));
IopReleaseActiveConnectLock((INT64)result);
if( v28 < 0 )
{
if( !a8 )
IopDestroyPassiveInterruptBlock(Vector);
}
else
{
if( a2 )
{
v29 = *(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64);
if( !v29 || (*(_DWORD *)(v29 + 396) & 0x20000) != 0 )
{
IoAddTriageDumpDataBlock((PVOID)a2, *(unsigned __int16 *)(a2 + 2));
v38 = *(__int16 **)(a2 + 8);
if( v38 )
{
IoAddTriageDumpDataBlock(v38, (unsigned int)v38[1]);
v39 = (_WORD *)(*(_QWORD *)(a2 + 8) + 56i64);
if( *v39 )
{
IoAddTriageDumpDataBlock(v39, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(a2 + 8) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(a2 + 8) + 56i64));
}
}
v40 = *(PVOID **)(*(_QWORD *)(a2 + 312) + 40i64);
if( v40 )
{
v41 = v40 + 5;
IoAddTriageDumpDataBlock(v40, 0x310ui64);
if( *(_WORD *)v41 )
{
IoAddTriageDumpDataBlock(v41, 2ui64);
IoAddTriageDumpDataBlock(v41[1], *(unsigned __int16 *)v41);
}
v42 = *(_QWORD *)(a2 + 312);
v43 = (_WORD *)(*(_QWORD *)(v42 + 40) + 56i64);
if( *v43 )
{
IoAddTriageDumpDataBlock(v43, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 56i64));
v42 = *(_QWORD *)(a2 + 312);
}
v44 = *(_QWORD *)(*(_QWORD *)(v42 + 40) + 16i64);
if( v44 )
{
v45 = (_WORD *)(v44 + 56);
if( *v45 )
{
IoAddTriageDumpDataBlock(v45, 2ui64);
v46 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 16i64);
IoAddTriageDumpDataBlock(*(PVOID *)(v46 + 64), *(unsigned __int16 *)(v46 + 56));
}
}
}
KeBugCheckEx(0xCAu, 2ui64, a2, 0i64, 0i64);
}
if( (char)v17 > 0 )
{
v30 = v19 + 496;
v31 = (0x101010101010101i64
* ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
do
{
ObfReferenceObjectWithTag((PVOID)a2, 0x54706E50u);
*(_QWORD *)(*(_QWORD *)v30 + 280i64) = a2;
_InterlockedIncrement((volatile signed __int32 *)(*(_QWORD *)(a2 + 312) + 96i64));
v30 += 8;
--v31;
}
while( v31 );
}
}
v32 = (_OWORD *)*((_QWORD *)v19 + 62);
v33 = v19 + 112;
v34 = 2i64;
do
{
*v33 = *v32;
v33[1] = v32[1];
v33[2] = v32[2];
v33[3] = v32[3];
v33[4] = v32[4];
v33[5] = v32[5];
v33[6] = v32[6];
v33 += 8;
v35 = v32[7];
v32 += 8;
*(v33 - 1) = v35;
--v34;
}
while( v34 );
v28 = 0;
*v33 = *v32;
v33[1] = v32[1];
*a1 = v19;
PnpTraceInterruptConnection();
}
if( v28 < 0 )
{
LABEL_33:
if( (char)v17 > 0 )
{
v37 = (_KINTERRUPT **)(v19 + 496);
do
{
if( *v37 )
KeFreeInterrupt(*v37);
++v37;
--v17;
}
while( v17 );
}
ExFreePoolWithTag(v19, 0x6E696F49u);
}
}
else
{
v28 = -1073741670;
}
}
else
{
v28 = -1073741811;
}
IopDestroyActiveConnectBlock((volatile INT32 *)result);
return(unsigned int)v28;
}Referenced by:
IoConnectInterruptEx
IopConnectInterruptFullySpecified
IopConnectLineBasedInterrupt
IopConnectMessageBasedInterrupt