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