IopResourceRequirementsListToReqList
NTSTATUS __stdcall IopResourceRequirementsListToReqList(PNP_RESOURCE_REQUEST *Request, VOID **ResReqList){
unsigned int *v2;
unsigned int v3;
unsigned int *v4;
unsigned int *v5;
int v6;
unsigned int *v7;
int v8;
int v9;
unsigned int *v10;
unsigned int *v11;
char v12;
char v13;
int v14;
int v15;
unsigned int v16;
NTSTATUS v17;
unsigned __int64 v18;
unsigned int v19;
unsigned __int64 v20;
signed int v21;
unsigned int v22;
__int64 v23;
unsigned __int64 v24;
unsigned int v25;
signed int v26;
unsigned int v27;
unsigned int v28;
unsigned int v29;
UINT64 v30;
size_t v31;
VOID **PoolWithTag;
VOID **v33;
unsigned int *v34;
_REQ_ALTERNATIVE **v35;
int v36;
unsigned int v37;
_REQ_ALTERNATIVE v38;
_REQ_ALTERNATIVE *v39;
_REQ_ALTERNATIVE *v40;
unsigned int *v41;
__int64 v42;
_REQ_ALTERNATIVE *v43;
int *v44;
int v45;
_REQ_DESC **v46;
_REQ_DESC i;
_REQ_DESC *v48;
_REQ_DESC *v49;
char v50;
bool v51;
char v52;
_REQ_DESC v53;
_REQ_DESC v54;
NTSTATUS v55;
bool v56;
int v58;
unsigned __int64 v59;
int v60;
unsigned int v61;
_REQ_DESC v62;
int v63;
_REQ_ALTERNATIVE **v64;
_REQ_ALTERNATIVE *ReqAlternative;
_REQ_ALTERNATIVE v66;
_REQ_DESC *ReqDesc;
_REQ_DESC **v68;
_REQ_ALTERNATIVE **v69;
int v72;
unsigned int *v73;
int v74;
*ResReqList = 0i64;
v2 = (unsigned int *)*((_QWORD *)Request + 3);
v72 = 0;
v73 = v2;
v3 = v2[7];
if( !v3 )
return 0;
v4 = (unsigned int *)((char *)v2 + *v2);
v5 = v2 + 8;
v6 = v3 - 1;
v7 = v2 + 8;
v8 = 0;
v9 = 0;
if( (int)(v3 - 1) >= 0 )
{
do
{
v10 = v7 + 2;
v7 += 8 * v7[1] + 2;
if( v10 == v7 )
return 0;
if( v10 > v7 || v10 > v4 || v7 > v4 )
return -1073741811;
if( *((_BYTE *)v10 + 1) == 0x80 )
v10 += 8;
v11 = v10;
LABEL_10:
v12 = 1;
while( v10 < v7 )
{
v13 = *((_BYTE *)v10 + 1);
v14 = v8;
if( (unsigned __int8)v13 == 128 )
return -1073741811;
if( *((unsigned __int8 *)v10 + 1) == 129 )
{
for( ; v10 < v7; v10 += 8 )
{
if( *((_BYTE *)v10 + 1) != 0x81 )
break;
if( v10 == v11 )
return -1073741811;
++v8;
}
goto LABEL_10;
}
v15 = ++v8;
if( v13 <= 0 )
{
v8 = v14;
*(_BYTE *)v10 = 1;
v10 += 8;
if( v13 != -16 )
v8 = v15;
goto LABEL_10;
}
if( (*(_BYTE *)v10 & 8) != 0 )
{
if( v12 )
return -1073741811;
++v9;
}
else
{
v12 = 0;
}
v10 += 8;
}
--v6;
}
while( v6 >= 0 );
v3 = v2[7];
}
v16 = v8 - v9;
v17 = -1073741823;
v18 = 296i64 * v16;
if( v18 > 0xFFFFFFFF )
return -2147483643;
if( v16 <= 1 )
{
v19 = 0;
v21 = 0;
}
else
{
v19 = -1;
v20 = 8i64 * (v16 - 1);
if( v20 <= 0xFFFFFFFF )
v19 = 8 * (v16 - 1);
v21 = v20 > 0xFFFFFFFF ? 0xC0000095 : 0;
}
if( v21 < 0 )
return -2147483643;
v22 = -1;
if( v19 + 32 >= v19 )
v22 = v19 + 32;
if( v19 + 32 < v19 )
return -2147483643;
v23 = 0xFFFFFFFFi64;
v24 = v3 * (unsigned __int64)v22;
if( v24 <= 0xFFFFFFFF )
v23 = (unsigned int)v24;
if( v24 > 0xFFFFFFFF )
return -2147483643;
if( v3 > 1 )
{
v25 = -1;
v59 = 8i64 * (v3 - 1);
if( v59 <= 0xFFFFFFFF )
v25 = 8 * (v3 - 1);
v26 = v59 > 0xFFFFFFFF ? 0xC0000095 : 0;
}
else
{
v25 = 0;
v26 = 0;
}
if( v26 < 0 )
return -2147483643;
v27 = -1;
if( v25 + 48 >= v25 )
v27 = v25 + 48;
if( v25 + 48 < v25 )
return -2147483643;
v28 = v23 + v27;
if( (unsigned int)v23 + v27 < v27 )
return -2147483643;
v29 = v28 + v18;
v30 = 0xFFFFFFFFi64;
if( v28 + (unsigned int)v18 >= v28 )
v30 = v29;
if( v29 < v28 )
return -2147483643;
v31 = v30;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v30, 538996816i64);
v33 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v31);
ReqAlternative = (_REQ_ALTERNATIVE *)((char *)v33 + v27);
memset(ReqAlternative, 0i64, v23);
ReqDesc = (_REQ_ALTERNATIVE *)((char *)ReqAlternative + v23);
memset((char *)ReqAlternative + v23, 0i64, v18);
v34 = v73;
v35 = (_REQ_ALTERNATIVE **)(v33 + 5);
v64 = (_REQ_ALTERNATIVE **)(v33 + 5);
v36 = v73[1];
v37 = v73[2];
if( v36 == -1 )
v36 = 1;
v61 = v73[2];
v33[2] = 0i64;
v33[1] = Request;
*((_DWORD *)v33 + 1) = v37;
v74 = v36;
*(_DWORD *)v33 = v36;
*((_DWORD *)v33 + 8) = v3;
memset(v33 + 5, 0i64, 8 * v3);
v38 = 0;
v63 = v3 - 1;
if( (int)(v3 - 1) < 0 )
goto LABEL_71;
do
{
v39 = ReqAlternative;
v69 = v35;
v40 = ReqAlternative;
v41 = v5 + 2;
v66 = v38;
v42 = v5[1];
v43 = ReqAlternative + 6;
*v64 = ReqAlternative;
ReqAlternative[4] = v38;
v5 = &v41[8 * v42];
++v38;
*((_QWORD *)ReqAlternative + 1) = v33;
ReqAlternative[5] = 0;
ReqAlternative += 6;
++v64;
if( *((_BYTE *)v41 + 1) == 0x80 )
{
v44 = (int *)(v41 + 2);
v41 += 8;
v45 = *v44;
}
else
{
v45 = 12288;
}
*v39 = v45;
v46 = (_REQ_DESC **)v43;
for( i = 0; ; i = v62 )
{
while( 1 )
{
if( v41 >= v5 )
{
v35 = v64;
goto LABEL_70;
}
if( *((_BYTE *)v41 + 1) != 0xF0 )
break;
v60 = v41[2];
if( v60 == -1 )
v60 = 1;
v61 = v41[3];
v74 = v60;
LABEL_91:
v41 += 8;
}
++v40[5];
v48 = ReqDesc;
v49 = ReqDesc;
*v46 = ReqDesc;
ReqDesc += 74;
v68 = v46 + 1;
v49[6] = i;
v49[1] = v61;
*((_QWORD *)v49 + 2) = v40;
*((_QWORD *)v49 + 4) = v49;
v49[69] = 0;
*((_QWORD *)v49 + 35) = 0i64;
*v49 = v74;
v50 = *((_BYTE *)v41 + 1);
v62 = i + 1;
v51 = v50 == 0;
if( v50 < 0 || (v52 = 1, v51) )
v52 = 0;
*((_BYTE *)v48 + 8) = v52;
v43 += 2;
*((_QWORD *)v48 + 6) = v48 + 10;
*((_QWORD *)v48 + 5) = v48 + 10;
v48[14] = 0;
*((_QWORD *)v48 + 8) = v41;
*((_QWORD *)v48 + 9) = *(_QWORD *)Request;
v48[20] = Request[3];
*((_QWORD *)v48 + 11) = 0i64;
v48[24] = v74;
v48[25] = v34[3];
v53 = v34[2];
v48[32] = -1;
v48[26] = v53;
*((_QWORD *)v48 + 14) = v48 + 34;
ReqAlternative = v43;
v48[21] = 0;
if( !*((_BYTE *)v48 + 8) )
{
++i;
*((_BYTE *)v49 + 136) = *((_BYTE *)v41 + 1);
*((_BYTE *)v48 + 137) = *((_BYTE *)v41 + 2);
*((_WORD *)v48 + 69) = *((_WORD *)v41 + 2);
v48[35] = v41[2];
v48[36] = v41[3];
v48[37] = v41[4];
v58 = v72;
if( *((_BYTE *)v41 + 1) == 0x84 )
v58 = 1;
v72 = v58;
v46 = v68;
goto LABEL_91;
}
*((_BYTE *)v49 + 136) = 8;
v54 = ++v48[14];
v72 = 1;
while( 1 )
{
v41 += 8;
if( v41 >= v5 )
break;
if( *((_BYTE *)v41 + 1) == 0x81 )
{
*((_QWORD *)v48 + 35) = v41;
while( v41 < v5 && *((_BYTE *)v41 + 1) == 0x81 )
{
++v48[69];
v41 += 8;
}
break;
}
if( (*(_BYTE *)v41 & 8) == 0 )
break;
v48[14] = ++v54;
}
v55 = IopSetupArbiterAndTranslators(v48);
if( v55 < 0 )
break;
v43 = ReqAlternative;
v46 = v68;
}
v35 = v69;
--*((_DWORD *)v33 + 8);
v38 = v66;
v64 = v69;
IopFreeReqAlternative(v40);
v17 = v55;
LABEL_70:
--v63;
}
while( v63 >= 0 );
LABEL_71:
v56 = v38 == 0;
if( !v38 )
{
IopFreeReqList((_REQ_LIST *)v33);
v56 = 1;
}
if( !v56 )
v17 = 0;
if( !v17 )
{
if( v72 )
*ResReqList = v33;
else
IopFreeReqList((_REQ_LIST *)v33);
}
return v17;
}Referenced by:
IopAllocateBootResourcesInternal
IopQueryConflictListInternal
PnpGetResourceRequirementsForAssignTable
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal