PnpFilterResourceRequirementsList
INT64 __stdcall PnpFilterResourceRequirementsList(
_IO_RESOURCE_REQUIREMENTS_LIST *IoList,
_CM_RESOURCE_LIST *CmList,
_IO_RESOURCE_REQUIREMENTS_LIST **FilteredList,
UINT64 *ExactMatch){
unsigned int v4;
_CM_RESOURCE_LIST *v6;
int v8;
UINT8 *PoolWithTag;
__int64 v10;
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *v11;
__int64 v12;
char *v13;
unsigned int v14;
__int64 i;
unsigned __int8 v16;
unsigned int v17;
int v18;
__int64 v19;
int v20;
unsigned __int64 v21;
int v22;
unsigned __int64 v23;
bool v24;
int v25;
int v26;
__int64 v27;
unsigned __int64 v28;
__int64 v29;
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *v30;
int v31;
unsigned int v32;
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *v33;
unsigned int v34;
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *v35;
unsigned __int64 v36;
unsigned int v37;
unsigned __int64 v38;
unsigned __int8 v39;
unsigned __int64 v40;
int v41;
unsigned __int64 v42;
int v43;
unsigned __int8 v44;
int v45;
unsigned __int64 v46;
unsigned __int64 v47;
unsigned __int64 v48;
unsigned __int64 v49;
UINT64 v50;
char v51;
_BYTE *m;
__int64 v53;
int v54;
unsigned int v55;
char *v56;
char *v57;
_DWORD *v58;
unsigned int v59;
int v60;
_OWORD *v61;
unsigned __int64 v62;
unsigned __int64 v63;
unsigned __int64 v64;
__int16 v65;
char *v66;
UINT64 v67;
int v69;
int v70;
int v71;
int v72;
int v73;
_BYTE *j;
_BYTE *k;
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
unsigned __int64 v77;
int v78;
unsigned int v79;
int v80;
int v81;
__int64 v82;
__int16 v83;
unsigned int v84;
unsigned int v85;
int v86;
int v87;
unsigned __int64 Start;
int v89;
int v90;
int v91;
unsigned __int64 MinimumAddress;
unsigned __int64 MaximumAddress;
unsigned __int64 Alignment;
__int64 v95;
unsigned __int64 v96;
UINT8 *v97;
__int64 v98;
_DWORD *v99;
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *v100;
unsigned __int8 v101;
v4 = 0;
v95 = 0i64;
v6 = CmList;
v80 = 0;
*FilteredList = 0i64;
v8 = 0;
*(_DWORD *)ExactMatch = 0;
if( !IoList || !*((_DWORD *)IoList + 7) )
{
if( CmList && *(_DWORD *)CmList )
*FilteredList = PnpCmResourcesToIoResources((CM_RESOURCE_LIST *)IoList, (UINT64)CmList, 1ui64);
return 0i64;
}
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, *(_DWORD *)IoList, 0x75737050ui64);
v97 = PoolWithTag;
v10 = (__int64)PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memmove(PoolWithTag, (UINT8 *)IoList, *(_DWORD *)IoList);
if( !v6 || !*(_DWORD *)v6 )
goto LABEL_154;
v11 = (struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *)((char *)v6 + 4);
v12 = *(_DWORD *)v6;
v99 = (_DWORD *)((char *)v6 + 4);
v13 = (char *)v6 + 4;
do
{
v14 = *((_DWORD *)v13 + 3);
v13 += 16;
v8 += v14;
if( v14 )
{
for( i = v14; i; --i )
{
v16 = *v13;
v17 = 0;
if( *v13 == 5 )
{
v17 = *((_DWORD *)v13 + 1);
}
else if( (v16 <= 0x7Fu || v16 > 0x81u) && (unsigned __int8)(v16 - 1) <= 6u )
{
goto LABEL_12;
}
--v8;
LABEL_12:
v13 += v17 + 20;
}
}
--v12;
}
while( v12 );
v81 = v8;
if( !v8 )
{
LABEL_154:
*FilteredList = (_IO_RESOURCE_REQUIREMENTS_LIST *)v10;
return 0i64;
}
v18 = *(_DWORD *)(v10 + 28);
v19 = v10 + 32;
v20 = 0;
v87 = 0;
v21 = v10 + 32;
v22 = v18 - 1;
if( v18 - 1 >= 0 )
{
do
{
v23 = v21 + 8;
v21 += 8 + 32i64 * *(unsigned int *)(v21 + 4);
while( v23 < v21 )
{
v24 = *(_BYTE *)(v23 + 1) == 0;
v25 = v20 + 1;
*(_BYTE *)(v23 + 3) = 0;
if( !v24 )
v25 = v20;
v23 += 32i64;
v20 = v25;
}
--v22;
}
while( v22 >= 0 );
v18 = *(_DWORD *)(v10 + 28);
v87 = v20;
}
v26 = v18 - 1;
v91 = v18 - 1;
v86 = v18 - 1;
if( v18 - 1 >= 0 )
{
while( 2 )
{
v83 = *(_WORD *)v19;
if( *(_WORD *)v19 == 0xFFFF )
v83 = 1;
v27 = *(unsigned int *)(v19 + 4);
v28 = v19 + 8;
*(_WORD *)v19 = 0;
v29 = v19 + 8 + 32 * v27;
v98 = v27;
v77 = v29;
if( v19 + 8 == v29 )
{
*(_WORD *)v19 = -1;
--*(_DWORD *)(v10 + 28);
goto LABEL_80;
}
v30 = v11;
v31 = 1;
v32 = 0;
v100 = v11;
v78 = 1;
v85 = 0;
if( *(_DWORD *)v6 )
{
do
{
v33 = (struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *)((char *)v30 + 16);
v34 = 0;
Descriptor = (struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *)((char *)v30 + 16);
v84 = 0;
if( *((_DWORD *)v30 + 3) )
{
v35 = v100;
do
{
if( *(_BYTE *)v33 == 5 )
{
v53 = *((unsigned int *)v33 + 1);
}
else
{
if( *(_BYTE *)v33 != 129 && (unsigned __int8)(*(_BYTE *)v33 - 1) <= 6u )
{
v36 = v77;
v37 = 0;
v79 = 0;
while( 1 )
{
v38 = v28;
if( v28 >= v36 )
goto LABEL_67;
v39 = *(_BYTE *)v33;
v40 = v77;
v101 = *(_BYTE *)v33;
while( 1 )
{
if( *(_BYTE *)(v38 + 1) != v39 || *(_BYTE *)(v38 + 3) )
goto LABEL_40;
v41 = *((unsigned __int8 *)v33 + 1);
v42 = 0i64;
v43 = *(unsigned __int8 *)(v38 + 2);
v44 = *((_BYTE *)v33 + 1) - 1;
Start = 0i64;
MinimumAddress = 0i64;
v45 = v41;
MaximumAddress = 0i64;
if( v44 > 2u )
v45 = v43;
v82 = 1i64;
v89 = v45;
Alignment = 1i64;
if( (unsigned __int8)(v43 - 1) > 2u )
v43 = (unsigned __int8)v45;
v46 = 0i64;
v90 = v43;
v47 = 0i64;
v48 = 1i64;
if( v39 != 1 )
{
if( v39 == 2 )
{
v42 = *((unsigned int *)Descriptor + 2);
v49 = v42;
LABEL_50:
v46 = *(unsigned int *)(v38 + 8);
v47 = *(unsigned int *)(v38 + 12);
LABEL_51:
v50 = 1i64;
goto LABEL_52;
}
if( v39 != 3 )
{
if( v39 == 4 )
{
v49 = *((unsigned int *)Descriptor + 1);
v42 = v49;
goto LABEL_50;
}
if( v39 == 6 )
{
v46 = *(unsigned int *)(v38 + 12);
v47 = *(unsigned int *)(v38 + 16);
v50 = *(unsigned int *)(v38 + 8);
v42 = *((unsigned int *)Descriptor + 1);
v48 = *((unsigned int *)Descriptor + 2);
v49 = (unsigned int)(v48 + v42 - 1);
goto LABEL_99;
}
if( v39 != 7 )
{
v49 = 0i64;
goto LABEL_51;
}
}
}
v67 = RtlCmDecodeMemIoResource(Descriptor, &Start);
v42 = Start;
v96 = v67;
Start = v67 + Start - 1;
v50 = RtlIoDecodeMemIoResource(
(IO_RESOURCE_DESCRIPTOR *)v38,
&Alignment,
&MinimumAddress,
&MaximumAddress);
v46 = MinimumAddress;
v47 = MaximumAddress;
v49 = Start;
v48 = v96;
LOBYTE(v45) = v89;
LOBYTE(v43) = v90;
LABEL_99:
v82 = v50;
LABEL_52:
if( v79 )
{
v78 = 0;
if( v47 >= v49
&& (_BYTE)v45 == (_BYTE)v43
&& v46 <= v42
&& v50 >= v48
&& ((Alignment - 1) & v42) == 0 )
{
v69 = v39 - 1;
if( !v69 )
goto LABEL_128;
v70 = v69 - 1;
if( !v70 )
goto LABEL_138;
v71 = v70 - 1;
if( !v71 )
goto LABEL_128;
v72 = v71 - 1;
if( v72 )
{
v73 = v72 - 2;
if( v73 )
{
if( v73 == 1 )
{
LABEL_128:
*(_QWORD *)(v38 + 16) = v42;
*(_QWORD *)(v38 + 24) = v42 + v82 - 1;
}
}
else
{
*(_DWORD *)(v38 + 12) = v42;
*(_DWORD *)(v38 + 16) = v42 + v82 - 1;
}
}
else
{
LABEL_138:
*(_DWORD *)(v38 + 8) = v42;
*(_DWORD *)(v38 + 12) = v49;
}
++*(_WORD *)v19;
v28 = v19 + 8;
v24 = (*(_BYTE *)v38 & 8) == 0;
v33 = Descriptor;
*(_BYTE *)(v38 + 3) = 0x80;
*(_WORD *)(v38 + 4) = *((_WORD *)Descriptor + 1);
if( !v24 )
{
for( j = (_BYTE *)(v38 - 32); (unsigned __int64)j >= v28; j -= 32 )
{
j[1] = 0;
--*(_DWORD *)(v19 + 4);
if( *j != 8 )
break;
}
}
v36 = v77;
*(_BYTE *)v38 = 1;
while( 1 )
{
v38 += 32i64;
if( v38 >= v77 || (*(_BYTE *)v38 & 8) == 0 )
break;
*(_BYTE *)(v38 + 1) = 0;
--*(_DWORD *)(v19 + 4);
}
v31 = 0;
LABEL_42:
v37 = v79;
goto LABEL_67;
}
goto LABEL_101;
}
if( v46 == v42 && (_BYTE)v45 == (_BYTE)v43 && v47 >= v49 && v50 >= v48 )
break;
LABEL_101:
v33 = Descriptor;
v39 = v101;
v40 = v77;
LABEL_40:
v38 += 32i64;
if( v38 >= v40 )
{
v36 = v77;
v28 = v19 + 8;
v31 = v78;
goto LABEL_42;
}
}
v31 = v78;
v24 = v47 == v49;
v28 = v19 + 8;
if( !v24 )
v31 = 0;
++*(_WORD *)v19;
v24 = (*(_BYTE *)v38 & 8) == 0;
v78 = v31;
*(_BYTE *)(v38 + 3) = 0x80;
if( !v24 )
{
for( k = (_BYTE *)(v38 - 32); (unsigned __int64)k >= v28; k -= 32 )
{
k[1] = 0;
--*(_DWORD *)(v19 + 4);
if( *k != 8 )
break;
}
}
v33 = Descriptor;
v51 = *(_BYTE *)(v38 + 1);
*(_BYTE *)v38 = 1;
*(_WORD *)(v38 + 4) = *((_WORD *)Descriptor + 1);
if( ((v51 - 1) & 0xF9) != 0 || v51 == 5 )
{
if( v51 == 6 )
{
*(_DWORD *)(v38 + 12) = v42;
*(_DWORD *)(v38 + 16) = v42 + v82 - 1;
}
}
else
{
*(_QWORD *)(v38 + 16) = v42;
*(_DWORD *)(v38 + 12) = 1;
*(_QWORD *)(v38 + 24) = v42 + v82 - 1;
}
v36 = v77;
for( m = (_BYTE *)(v38 + 32); (unsigned __int64)m < v77 && (*m & 8) != 0; m += 32 )
{
m[1] = 0;
--*(_DWORD *)(v19 + 4);
}
v37 = 1;
LABEL_67:
v79 = ++v37;
if( v37 >= 2 )
{
v34 = v84;
break;
}
}
}
v53 = 0i64;
}
++v34;
v33 = (struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *)((char *)v33 + v53 + 20);
v84 = v34;
Descriptor = v33;
}
while( v34 < *((_DWORD *)v35 + 3) );
v6 = CmList;
v32 = v85;
}
++v32;
v30 = v33;
v100 = v33;
v85 = v32;
}
while( v32 < *(_DWORD *)v6 );
v10 = (__int64)v97;
v11 = (struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *)((char *)v6 + 4);
v8 = v81;
v29 = v77;
v26 = v86;
LODWORD(v27) = v98;
}
if( *(_WORD *)v19 == (_WORD)v8 )
{
v54 = *(_DWORD *)(v19 + 4);
if( v54 != v8 && (v54 != v8 + 1 || *(_BYTE *)(v19 + 9) != 0x80) )
{
v80 += v54;
*(_WORD *)v19 = v83;
goto LABEL_79;
}
if( !v95 )
{
v80 += v54;
v95 = v19;
*(_WORD *)v19 = v83;
if( v31 )
*(_DWORD *)ExactMatch = 1;
goto LABEL_79;
}
}
*(_WORD *)v19 = -1;
--*(_DWORD *)(v10 + 28);
LABEL_79:
*(_DWORD *)(v19 + 4) = v27;
v19 = v29;
LABEL_80:
v18 = *(_DWORD *)(v10 + 28);
v86 = --v26;
if( v26 >= 0 )
continue;
break;
}
v20 = v87;
}
if( v18 )
{
v55 = 32 * (v80 - v20 + 1) + 40 * v18;
v56 = (char *)ExAllocatePoolWithTag(PagedPool, v55, 0x75737050ui64);
v57 = v56;
if( v56 )
{
memset((INT64)v56, 0i64);
v58 = v99;
*(_DWORD *)v57 = v55;
*((_DWORD *)v57 + 1) = *v58;
*((_DWORD *)v57 + 2) = *((_DWORD *)CmList + 2);
*((_DWORD *)v57 + 3) = *(_DWORD *)(v10 + 12);
v59 = *(_DWORD *)(v10 + 28);
if( v59 > 1 )
*(_DWORD *)ExactMatch = 0;
v60 = v91;
v61 = v57 + 32;
*((_DWORD *)v57 + 7) = v59;
if( v60 >= 0 )
{
v62 = v10 + 32;
do
{
v63 = v62 + 8;
v64 = v62 + 8 + 32i64 * *(unsigned int *)(v62 + 4);
if( *(_WORD *)v62 != 0xFFFF )
{
*(_WORD *)v61 = *(_WORD *)v62;
v65 = *(_WORD *)(v62 + 2);
v66 = (char *)v61 + 8;
*((_WORD *)v61 + 1) = v65;
if( *(_BYTE *)(v63 + 1) == 0x80 )
{
*(_DWORD *)v57 -= 32;
}
else
{
*((_WORD *)v61 + 4) = -32767;
v66 = (char *)v61 + 40;
*(_DWORD *)((char *)v61 + 10) = 3;
*((_WORD *)v61 + 7) = 0;
*((_DWORD *)v61 + 4) = 1;
}
while( v63 < v64 )
{
if( *(_BYTE *)(v63 + 1) )
{
*(_OWORD *)v66 = *(_OWORD *)v63;
*((_OWORD *)v66 + 1) = *(_OWORD *)(v63 + 16);
v66 += 32;
}
v63 += 32i64;
}
*((_DWORD *)v61 + 1) = (v66 - (char *)v61 - 8) >> 5;
*((_DWORD *)v61 + 4) = 1;
v61 = v66;
}
--v60;
v62 = v64;
}
while( v60 >= 0 );
}
*FilteredList = (_IO_RESOURCE_REQUIREMENTS_LIST *)v57;
ExFreePoolWithTag((PVOID)v10, 0);
return 0i64;
}
v4 = -1073741670;
}
else
{
*FilteredList = PnpCmResourcesToIoResources((CM_RESOURCE_LIST *)0xFFFF, (UINT64)v6, 1ui64);
}
ExFreePoolWithTag((PVOID)v10, 0);
return v4;
}Referenced by:
IopQueryDeviceResources
PnpGetResourceRequirementsForAssignTable