IopTranslateAndAdjustReqDesc

VOID __stdcall IopTranslateAndAdjustReqDesc(
        _REQ_DESC *ReqDesc,
        _PI_RESOURCE_TRANSLATOR_ENTRY *TranslatorEntry,
        _REQ_DESC **TranslatedReqDesc,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        INT64 a10,
        INT64 a11,
        INT64 a12,
        INT64 a13,
        UINT64 SpinCount){
  _REQ_DESC *v14; 
  int v15; 
  unsigned int v16; 
  unsigned int v17; 
  _REQ_DESC *v18; 
  VOID **PoolWithTag; 
  VOID **v20; 
  VOID **v21; 
  VOID **v22; 
  char *v23; 
  __int64 v24; 
  int v25; 
  int v26; 
  VOID **v27; 
  VOID **v28; 
  VOID **v29; 
  VOID **v30; 
  __int64 v31; 
  __int128 v32; 
  VOID *v33; 
  __int64 v34; 
  _OWORD *v35; 
  int v36; 
  __int64 v37; 
  __int64 j; 
  VOID **P; 
  int *v40; 
  __int64 v41; 
  VOID **v42; 
  _OWORD **v43; 
  VOID **v44; 
  int i; 

  v14 = ReqDesc + 14;
  v15 = 0;
  v41 = *((_QWORD *)TranslatorEntry + 3);
  v16 = ReqDesc[14];
  v17 = 0;
  v18 = ReqDesc;
  if( v16 )
  {
    *TranslatedReqDesc = 0i64;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * v16, 538996816i64);
    v20 = PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 8 * *v14);
      v21 = ExAllocatePoolWithTag(1ui64, 4i64 * (unsigned int)*v14, 538996816i64);
      P = v21;
      v22 = v21;
      if( v21 )
      {
        memset(v21, 0i64, 4 * *v14);
        v23 = (char *)*((_QWORD *)v18 + 8);
        v43 = (_OWORD **)(v18 + 16);
        v24 = 0i64;
        for( i = 0; (unsigned int)v24 < *v14; i = v24 )
        {
          v42 = &v20[v24];
          v40 = (int *)v22 + v24;
          v25 = (*(__int64(__fastcall **)(_QWORD, char *, _QWORD, int *, VOID **))(v41 + 40))(
                  *(_QWORD *)(v41 + 8),
                  v23,
                  *((_QWORD *)v18 + 9),
                  v40,
                  v42);
          if( v25 < 0 || (v26 = *v40) == 0 )
          {
            *v42 = v23;
            v26 = 1;
            *v40 = 0;
          }
          v17 += v26;
          v23 += 32;
          if( v25 >= 0 && v15 != 288 )
            v15 = v25;
          v24 = (unsigned int)(i + 1);
        }
        v27 = ExAllocatePoolWithTag(1ui64, 32i64 * v17, 538996816i64);
        if( v27 )
        {
          v28 = ExAllocatePoolWithTag(1ui64, 0x128ui64, 538996816i64);
          v44 = v28;
          v29 = v28;
          if( v28 )
          {
            v30 = v28;
            v31 = 2i64;
            do
            {
              *(_OWORD *)v30 = *(_OWORD *)v18;
              *((_OWORD *)v30 + 1) = *((_OWORD *)v18 + 1);
              *((_OWORD *)v30 + 2) = *((_OWORD *)v18 + 2);
              *((_OWORD *)v30 + 3) = *((_OWORD *)v18 + 3);
              *((_OWORD *)v30 + 4) = *((_OWORD *)v18 + 4);
              *((_OWORD *)v30 + 5) = *((_OWORD *)v18 + 5);
              *((_OWORD *)v30 + 6) = *((_OWORD *)v18 + 6);
              v30 += 16;
              v32 = *((_OWORD *)v18 + 7);
              v18 += 32;
              *((_OWORD *)v30 - 1) = v32;
              --v31;
            }
            while( v31 );
            *(_OWORD *)v30 = *(_OWORD *)v18;
            *((_OWORD *)v30 + 1) = *((_OWORD *)v18 + 1);
            v33 = (VOID *)*((_QWORD *)v18 + 4);
            v34 = 0i64;
            v30[4] = v33;
            v29[2] = 0i64;
            v29[4] = 0i64;
            v29[36] = TranslatorEntry;
            v29[14] = v29 + 17;
            v29[6] = v29 + 5;
            v29[5] = v29 + 5;
            *((_DWORD *)v29 + 14) = v17;
            v29[8] = v27;
            v35 = *v43;
            if( *v14 )
            {
              while( 1 )
              {
                v36 = *((_DWORD *)P + v34);
                if( !v36 )
                  break;
                memmove(v27, v20[v34], 32 * v36);
                v37 = 32i64 * *((unsigned int *)P + v34);
LABEL_18:
                v35 += 2;
                v34 = (unsigned int)(v34 + 1);
                v27 = (VOID **)((char *)v27 + v37);
                if( (unsigned int)v34 >= *v14 )
                {
                  v29 = v44;
                  goto LABEL_20;
                }
              }
              *(_OWORD *)v27 = *v35;
              *((_OWORD *)v27 + 1) = v35[1];
              if( *((_BYTE *)v27 + 1) == 1 )
                goto LABEL_39;
              if( *((_BYTE *)v27 + 1) != 2 )
              {
                if( *((_BYTE *)v27 + 1) == 3 )
                  goto LABEL_39;
                if( *((_BYTE *)v27 + 1) != 4 )
                {
                  if( *((_BYTE *)v27 + 1) == 6 )
                  {
                    *((_DWORD *)v27 + 3) = 2;
                    *((_DWORD *)v27 + 4) = 1;
                    goto LABEL_40;
                  }
                  if( *((_BYTE *)v27 + 1) != 7 )
                  {
LABEL_40:
                    v37 = 32i64;
                    goto LABEL_18;
                  }
LABEL_39:
                  *((_DWORD *)v27 + 5) = 0;
                  *((_DWORD *)v27 + 7) = 0;
                  *((_DWORD *)v27 + 4) = 2;
                  *((_DWORD *)v27 + 6) = 1;
                  goto LABEL_40;
                }
              }
              *((_DWORD *)v27 + 2) = 2;
              *((_DWORD *)v27 + 3) = 1;
              goto LABEL_40;
            }
LABEL_20:
            *TranslatedReqDesc = (_REQ_DESC *)v29;
          }
          else
          {
            ExFreePoolWithTag(v27, 0);
          }
          v22 = P;
        }
        for( j = 0i64; (unsigned int)j < *v14; j = (unsigned int)(j + 1) )
        {
          if( *((_DWORD *)v22 + j) )
            ExFreePoolWithTag(v20[j], 0);
        }
        ExFreePoolWithTag(v20, 0);
        ExFreePoolWithTag(v22, 0);
      }
      else
      {
        ExFreePoolWithTag(v20, 0);
      }
    }
  }
}

Referenced by:

IopSetupArbiterAndTranslators