PnpReleaseBootResourcesForFilteredRequirements
__int64 __fastcall PnpReleaseBootResourcesForFilteredRequirements(__int64 *a1){
VOID **v2;
__int64 v3;
__int64 v4;
__int64 v5;
_DWORD *v6;
VOID **v7;
NTSTATUS v8;
_REQ_LIST *v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 *v13;
__int64 v14;
__int64 v15;
_PI_RESOURCE_ARBITER_ENTRY *v16;
unsigned int v17;
__int64 i;
__int64 v19;
_LIST_ENTRY *Blink;
NTSTATUS v22;
__int64 v23;
__int64 v24;
__int64 v25[12];
PNP_RESOURCE_REQUEST Request[16];
memset(v25, 0i64, sizeof(v25));
v2 = 0i64;
memset(Request, 0i64, sizeof(Request));
v4 = *a1;
if( *a1 )
v5 = *(_QWORD *)(*(_QWORD *)(v4 + 312) + 40i64);
else
v5 = 0i64;
v6 = *(_DWORD **)(v5 + 544);
if( !v6 || (v7 = PnpCmResourcesToIoResources(v3, v6, 1), (v2 = v7) == 0i64) )
{
v8 = -1073741823;
goto LABEL_15;
}
Request[3] = 4;
*(_QWORD *)&Request[6] = v7;
*(_QWORD *)Request = v4;
v8 = IopResourceRequirementsListToReqList(Request, (VOID **)&Request[8]);
if( v8 < 0 )
{
LABEL_15:
v9 = *(_REQ_LIST **)&Request[8];
goto LABEL_16;
}
v9 = *(_REQ_LIST **)&Request[8];
if( !*(_QWORD *)&Request[8] )
goto LABEL_18;
v10 = *(_QWORD *)(*(_QWORD *)&Request[8] + 40i64);
v8 = 0;
v11 = a1[4];
v12 = 0i64;
v13 = *(__int64 **)(v11 + 16);
v14 = *(_QWORD *)(v5 + 32);
v15 = *v13;
v25[6] = 0i64;
v25[9] = 0i64;
v25[4] = v14;
v25[5] = 4i64;
if( *(_DWORD *)(v10 + 20) )
{
do
{
v16 = *(_PI_RESOURCE_ARBITER_ENTRY **)(*(_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 && v16->ResourceType == *(_BYTE *)(v19 + 16) )
break;
}
if( (_DWORD)i == v17 )
{
v25[1] = (__int64)v25;
v25[0] = (__int64)v25;
Blink = v16->ResourceList.Blink;
if( Blink->Flink != &v16->ResourceList )
goto LABEL_27;
v25[1] = (__int64)v16->ResourceList.Blink;
v25[0] = (__int64)&v16->ResourceList;
Blink->Flink = (_LIST_ENTRY *)v25;
v16->ResourceList.Blink = (_LIST_ENTRY *)v25;
v22 = IopCallArbiter(v16, ArbiterActionTestAllocation, &v16->ResourceList);
v23 = v25[0];
v8 = v22;
v24 = v25[1];
if( *(__int64 **)(v25[0] + 8) != v25 || *(__int64 **)v25[1] != v25 )
LABEL_27:
__fastfail(3u);
*(_QWORD *)v25[1] = v25[0];
*(_QWORD *)(v23 + 8) = v24;
if( v8 < 0 )
break;
v8 = IopCallArbiter(v16, ArbiterActionCommitAllocation, 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