IopConnectLineBasedInterrupt
INT64 IopConnectLineBasedInterrupt(void){
_QWORD *v0;
ULONG_PTR v1;
__int64(__fastcall *v2)(__int64, __int64);
__int64 v3;
_BYTE *v4;
unsigned int v5;
__int64 v6;
INT64 v7;
int v8;
unsigned int *v9;
unsigned int v10;
unsigned __int8 v11;
char *v12;
__int64 v13;
char v14;
_BYTE *PoolWithTag;
unsigned int v16;
__int64 v17;
__int128 v18;
__int128 v19;
__int128 v20;
__int128 v21;
__int64 v22;
_OWORD *v23;
_OWORD *v24;
__int128 v25;
char *v26;
__int64 v27;
__int64 v28;
void *P[2];
int i;
_BYTE result[20];
__int128 v32;
__int128 v33;
__int128 v34;
__int128 v35;
__int64 v36;
ULONG_PTR v37;
_QWORD *v38;
__int64(__fastcall *v39)(__int64, __int64);
__int64 v40;
__int64 v41;
unsigned __int8 v42;
v40 = v3;
v39 = v2;
v38 = v0;
v37 = v1;
P[0] = 0i64;
v4 = 0i64;
*v0 = 0i64;
v5 = 0;
if( !v1 )
return 3221225485i64;
v6 = *(_QWORD *)(*(_QWORD *)(v1 + 312) + 40i64);
if( !v6 || (*(_DWORD *)(v6 + 396) & 0x20000) != 0 || !v2 )
return 3221225485i64;
IopGetInterruptConnectionData((PDEVICE_OBJECT)v1, P);
v8 = v7;
if( (int)v7 >= 0 )
{
v9 = (unsigned int *)P[0];
if( P[0] )
{
v10 = 0;
v11 = 0;
if( *(_DWORD *)P[0] )
{
v12 = (char *)P[0] + 8;
v13 = *(unsigned int *)P[0];
do
{
if( !*(_DWORD *)v12 )
{
++v10;
v14 = v11;
if( v11 < (unsigned __int8)v12[8] )
v14 = v12[8];
v11 = v14;
}
v12 += 88;
--v13;
}
while( v13 );
if( v10 )
{
if( !v42 )
goto LABEL_18;
if( v42 >= v11 )
{
v11 = v42;
LABEL_18:
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 8 * v10 + 296, 0x6E696F49ui64);
v4 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
v4[288] = v11;
*((_DWORD *)v4 + 73) = v10;
memset((INT64)result, 0i64);
v16 = 0;
for( i = 1; v16 < *v9; ++v16 )
{
v17 = 22i64 * v16;
if( !v9[v17 + 2] )
{
v18 = *(_OWORD *)&v9[v17 + 6];
*(_OWORD *)&result[4] = *(_OWORD *)&v9[v17 + 2];
v19 = *(_OWORD *)&v9[v17 + 10];
v32 = v18;
v20 = *(_OWORD *)&v9[v17 + 14];
v33 = v19;
v21 = *(_OWORD *)&v9[v17 + 18];
v34 = v20;
v36 = *(_QWORD *)&v9[v17 + 22];
v35 = v21;
v8 = IopConnectInterrupt(&v4[8 * v5 + 296], v37, v39, 0i64, v40, 0, v41, v11, 1, v28, (__int64)&i);
if( v8 < 0 )
goto LABEL_26;
if( ++v5 >= v10 )
break;
}
}
v22 = 2i64;
v23 = v4;
v24 = (_OWORD *)(*((_QWORD *)v4 + 37) + 112i64);
do
{
*v23 = *v24;
v23[1] = v24[1];
v23[2] = v24[2];
v23[3] = v24[3];
v23[4] = v24[4];
v23[5] = v24[5];
v23[6] = v24[6];
v23 += 8;
v25 = v24[7];
v24 += 8;
*(v23 - 1) = v25;
--v22;
}
while( v22 );
*v23 = *v24;
v23[1] = v24[1];
*v38 = v4;
}
else
{
v8 = -1073741670;
}
goto LABEL_26;
}
}
}
v8 = -1073741811;
LABEL_26:
ExFreePoolWithTag(v9, 0);
if( v8 < 0 && v4 )
{
if( v5 )
{
v26 = v4 + 296;
v27 = v5;
do
{
IoDisconnectInterrupt((PKINTERRUPT)(*(_QWORD *)v26 + 112i64));
v26 += 8;
--v27;
}
while( v27 );
}
ExFreePoolWithTag(v4, 0);
}
return(unsigned int)v8;
}
}
return v7;
}Referenced by:
IoConnectInterruptEx