IopResourceRequirementsListToReqList
INT64 __fastcall IopResourceRequirementsListToReqList(INT64 a1, CHAR **a2){
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;
unsigned int 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;
_QWORD *PoolWithTag;
_QWORD *v32;
unsigned int *v33;
INT64 *v34;
int v35;
unsigned int v36;
int v37;
_DWORD *v38;
__int64 v39;
unsigned int *v40;
__int64 v41;
INT64 *v42;
int *v43;
int v44;
INT64 *v45;
int i;
INT64 v47;
INT64 v48;
char v49;
bool v50;
char v51;
unsigned int v52;
int v53;
int v54;
bool v55;
int v57;
unsigned __int64 v58;
int v59;
unsigned int v60;
int v61;
int v62;
INT64 *v63;
INT64 v64;
int v65;
INT64 v66;
INT64 *v67;
INT64 *v68;
int v71;
unsigned int *v72;
int v73;
*a2 = 0i64;
v2 = *(unsigned int **)(a1 + 24);
v71 = 0;
v72 = v2;
v3 = v2[7];
if( !v3 )
return 0i64;
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 0i64;
if( v10 > v7 || v10 > v4 || v7 > v4 )
return 3221225485i64;
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 3221225485i64;
if( *((unsigned __int8 *)v10 + 1) == 129 )
{
for( ; v10 < v7; v10 += 8 )
{
if( *((_BYTE *)v10 + 1) != 0x81 )
break;
if( v10 == v11 )
return 3221225485i64;
++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 3221225485i64;
++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 2147483653i64;
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 2147483653i64;
v22 = -1;
if( v19 + 32 >= v19 )
v22 = v19 + 32;
if( v19 + 32 < v19 )
return 2147483653i64;
v23 = 0xFFFFFFFFi64;
v24 = v3 * (unsigned __int64)v22;
if( v24 <= 0xFFFFFFFF )
v23 = (unsigned int)v24;
if( v24 > 0xFFFFFFFF )
return 2147483653i64;
if( v3 > 1 )
{
v25 = -1;
v58 = 8i64 * (v3 - 1);
if( v58 <= 0xFFFFFFFF )
v25 = 8 * (v3 - 1);
v26 = v58 > 0xFFFFFFFF ? 0xC0000095 : 0;
}
else
{
v25 = 0;
v26 = 0;
}
if( v26 < 0 )
return 2147483653i64;
v27 = -1;
if( v25 + 48 >= v25 )
v27 = v25 + 48;
if( v25 + 48 < v25 )
return 2147483653i64;
v28 = v23 + v27;
if( (unsigned int)v23 + v27 < v27 )
return 2147483653i64;
v29 = v28 + v18;
v30 = 0xFFFFFFFFi64;
if( v28 + (unsigned int)v18 >= v28 )
v30 = v29;
if( v29 < v28 )
return 2147483653i64;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, v30, 0x20207050ui64);
v32 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memset((INT64)PoolWithTag, 0i64);
v64 = (INT64)v32 + v27;
memset(v64, 0i64);
v66 = v23 + v64;
memset(v23 + v64, 0i64);
v33 = v72;
v34 = v32 + 5;
v63 = v32 + 5;
v35 = v72[1];
v36 = v72[2];
if( v35 == -1 )
v35 = 1;
v60 = v72[2];
v32[2] = 0i64;
v32[1] = a1;
*((_DWORD *)v32 + 1) = v36;
v73 = v35;
*(_DWORD *)v32 = v35;
*((_DWORD *)v32 + 8) = v3;
memset((INT64)(v32 + 5), 0i64);
v37 = 0;
v62 = v3 - 1;
if( (int)(v3 - 1) < 0 )
goto LABEL_71;
do
{
v38 = (_DWORD *)v64;
v68 = v34;
v39 = v64;
v40 = v5 + 2;
v65 = v37;
v41 = v5[1];
v42 = (INT64 *)(v64 + 24);
*v63 = v64;
*(_DWORD *)(v64 + 16) = v37;
v5 = &v40[8 * v41];
++v37;
*(_QWORD *)(v64 + 8) = v32;
*(_DWORD *)(v64 + 20) = 0;
v64 += 24i64;
++v63;
if( *((_BYTE *)v40 + 1) == 0x80 )
{
v43 = (int *)(v40 + 2);
v40 += 8;
v44 = *v43;
}
else
{
v44 = 12288;
}
*v38 = v44;
v45 = v42;
for( i = 0; ; i = v61 )
{
while( 1 )
{
if( v40 >= v5 )
{
v34 = v63;
goto LABEL_70;
}
if( *((_BYTE *)v40 + 1) != 0xF0 )
break;
v59 = v40[2];
if( v59 == -1 )
v59 = 1;
v60 = v40[3];
v73 = v59;
LABEL_91:
v40 += 8;
}
++*(_DWORD *)(v39 + 20);
v47 = v66;
v48 = v66;
*v45 = v66;
v66 += 296i64;
v67 = v45 + 1;
*(_DWORD *)(v48 + 24) = i;
*(_DWORD *)(v48 + 4) = v60;
*(_QWORD *)(v48 + 16) = v39;
*(_QWORD *)(v48 + 32) = v48;
*(_DWORD *)(v48 + 276) = 0;
*(_QWORD *)(v48 + 280) = 0i64;
*(_DWORD *)v48 = v73;
v49 = *((_BYTE *)v40 + 1);
v61 = i + 1;
v50 = v49 == 0;
if( v49 < 0 || (v51 = 1, v50) )
v51 = 0;
*(_BYTE *)(v47 + 8) = v51;
++v42;
*(_QWORD *)(v47 + 48) = v47 + 40;
*(_QWORD *)(v47 + 40) = v47 + 40;
*(_DWORD *)(v47 + 56) = 0;
*(_QWORD *)(v47 + 64) = v40;
*(_QWORD *)(v47 + 72) = *(_QWORD *)a1;
*(_DWORD *)(v47 + 80) = *(_DWORD *)(a1 + 12);
*(_QWORD *)(v47 + 88) = 0i64;
*(_DWORD *)(v47 + 96) = v73;
*(_DWORD *)(v47 + 100) = v33[3];
v52 = v33[2];
*(_DWORD *)(v47 + 128) = -1;
*(_DWORD *)(v47 + 104) = v52;
*(_QWORD *)(v47 + 112) = v47 + 136;
v64 = (INT64)v42;
*(_DWORD *)(v47 + 84) = 0;
if( !*(_BYTE *)(v47 + 8) )
{
++i;
*(_BYTE *)(v48 + 136) = *((_BYTE *)v40 + 1);
*(_BYTE *)(v47 + 137) = *((_BYTE *)v40 + 2);
*(_WORD *)(v47 + 138) = *((_WORD *)v40 + 2);
*(_DWORD *)(v47 + 140) = v40[2];
*(_DWORD *)(v47 + 144) = v40[3];
*(_DWORD *)(v47 + 148) = v40[4];
v57 = v71;
if( *((_BYTE *)v40 + 1) == 0x84 )
v57 = 1;
v71 = v57;
v45 = v67;
goto LABEL_91;
}
*(_BYTE *)(v48 + 136) = 8;
v53 = ++*(_DWORD *)(v47 + 56);
v71 = 1;
while( 1 )
{
v40 += 8;
if( v40 >= v5 )
break;
if( *((_BYTE *)v40 + 1) == 0x81 )
{
*(_QWORD *)(v47 + 280) = v40;
while( v40 < v5 && *((_BYTE *)v40 + 1) == 0x81 )
{
++*(_DWORD *)(v47 + 276);
v40 += 8;
}
break;
}
if( (*(_BYTE *)v40 & 8) == 0 )
break;
*(_DWORD *)(v47 + 56) = ++v53;
}
v54 = IopSetupArbiterAndTranslators(v47);
if( v54 < 0 )
break;
v42 = (INT64 *)v64;
v45 = v67;
}
v34 = v68;
--*((_DWORD *)v32 + 8);
v37 = v65;
v63 = v68;
IopFreeReqAlternative(v39);
v17 = v54;
LABEL_70:
--v62;
}
while( v62 >= 0 );
LABEL_71:
v55 = v37 == 0;
if( !v37 )
{
IopFreeReqList(v32);
v55 = 1;
}
if( !v55 )
v17 = 0;
if( !v17 )
{
if( v71 )
*a2 = (CHAR *)v32;
else
IopFreeReqList(v32);
}
return v17;
}Referenced by:
IopAllocateBootResourcesInternal
IopQueryConflictListInternal
PnpGetResourceRequirementsForAssignTable
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal