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