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