PnpReleaseBootResourcesForFilteredRequirements
INT64 __fastcall PnpReleaseBootResourcesForFilteredRequirements(INT64 *a1){
IO_RESOURCE_REQUIREMENTS_LIST *v2;
CM_RESOURCE_LIST *v3;
INT64 v4;
__int64 v5;
UINT64 v6;
IO_RESOURCE_REQUIREMENTS_LIST *v7;
int v8;
PVOID v9;
__int64 v10;
INT64 v11;
__int64 v12;
__int64 *v13;
__int64 v14;
__int64 v15;
INT64 v16;
unsigned int v17;
__int64 i;
__int64 v19;
INT64 **v21;
int v22;
INT64 v23;
INT64 *v24;
INT64 result;
INT64 *p_result;
__int64 v27;
int v28;
int v29;
__int64 v30;
__int64 v31;
INT64 v32;
int v33;
IO_RESOURCE_REQUIREMENTS_LIST *v34;
PVOID P;
memset((INT64)&result, 0i64);
v2 = 0i64;
memset((INT64)&v32, 0i64);
v4 = *a1;
if( *a1 )
v5 = *(_QWORD *)(*(_QWORD *)(v4 + 312) + 40i64);
else
v5 = 0i64;
v6 = *(_QWORD *)(v5 + 544);
if( !v6 || (v7 = PnpCmResourcesToIoResources(v3, v6, 1ui64), (v2 = v7) == 0i64) )
{
v8 = -1073741823;
goto LABEL_15;
}
v33 = 4;
v34 = v7;
v32 = v4;
v8 = IopResourceRequirementsListToReqList((INT64)&v32, (CHAR **)&P);
if( v8 < 0 )
{
LABEL_15:
v9 = P;
goto LABEL_16;
}
v9 = P;
if( !P )
goto LABEL_18;
v10 = *((_QWORD *)P + 5);
v8 = 0;
v11 = a1[4];
v12 = 0i64;
v13 = *(__int64 **)(v11 + 16);
v14 = *(_QWORD *)(v5 + 32);
v15 = *v13;
v29 = 0;
v30 = 0i64;
v31 = 0i64;
v27 = v14;
v28 = 4;
if( *(_DWORD *)(v10 + 20) )
{
do
{
v16 = *(_QWORD *)(*(_QWORD *)(v10 + 8 * v12 + 24) + 288i64);
if( v16 )
{
v17 = *(_DWORD *)(v15 + 20);
for( i = 0i64; (unsigned int)i < v17; i = (unsigned int)(i + 1) )
{
v19 = *(_QWORD *)(*(_QWORD *)(v15 + 8 * i + 24) + 288i64);
if( v19 && *(_BYTE *)(v16 + 16) == *(_BYTE *)(v19 + 16) )
break;
}
if( (_DWORD)i == v17 )
{
p_result = &result;
result = (INT64)&result;
v21 = *(INT64 ***)(v16 + 48);
if( *v21 != (INT64 *)(v16 + 40) )
goto LABEL_27;
p_result = *(INT64 **)(v16 + 48);
result = v16 + 40;
*v21 = &result;
*(_QWORD *)(v16 + 48) = &result;
v22 = IopCallArbiter(v16, 0i64, v16 + 40);
v23 = result;
v8 = v22;
v24 = p_result;
if( *(INT64 **)(result + 8) != &result || (INT64 *)*p_result != &result )
LABEL_27:
__fastfail(3u);
*p_result = result;
*(_QWORD *)(v23 + 8) = v24;
if( v8 < 0 )
break;
v8 = IopCallArbiter(v16, 2i64, 0i64);
if( v8 < 0 )
break;
}
}
v12 = (unsigned int)(v12 + 1);
}
while( (unsigned int)v12 < *(_DWORD *)(v10 + 20) );
goto LABEL_15;
}
LABEL_16:
if( v9 )
IopFreeReqList(v9);
LABEL_18:
if( v2 )
ExFreePoolWithTag(v2, 0);
return(unsigned int)v8;
}Referenced by:
IopReleaseFilteredBootResources