IopReleaseFilteredBootResources

VOID __fastcall IopReleaseFilteredBootResources(UINT64 a1, UINT64 a2){
  int v2; 
  UINT64 v3; 
  _DWORD *v5; 
  __int64 v6; 
  __int64 v7; 
  int v8; 
  _DWORD *v9; 
  int v10; 
  if( a1 < a2 )
  {
    v2 = 0;
    v3 = a1 + 40;
    do
    {
      if( (*(_DWORD *)(v3 - 32) & 0x28) == 0 )
      {
        if( !*(_DWORD *)(v3 + 16) && *(_DWORD *)(v3 - 28) == 4 )
        {
          v5 = *(_DWORD **)v3;
          if( *(_QWORD *)v3 )
          {
            v10 = 0;
            v6 = *(_QWORD *)(v3 - 40);
            if( v6 )
              v7 = *(_QWORD *)(*(_QWORD *)(v6 + 312) + 40i64);
            else
              v7 = 0i64;
            if( (unsigned int)PnpNeedToReleaseBootResources(v7, v5, &v10) )
            {
              v2 = 1;
              v8 = PnpReleaseBootResourcesForFilteredRequirements((INT64 *)(v3 - 40));
              PipClearDevNodeFlags((_DEVICE_NODE *)v7, 0x80ui64);
              if( v8 < 0 )
              {
                v9 = *(_DWORD **)v3;
                *(_DWORD *)(v3 - 32) = 16;
                *(_DWORD *)(v3 + 16) = v8;
                ExFreePoolWithTag(v9, 0);
                *(_QWORD *)v3 = 0i64;
              }
              *(_QWORD *)(v7 + 416) = 0i64;
            }
            else if( v10 )
            {
              v2 = 1;
            }
          }
        }
        if( ((*(_DWORD *)(v3 - 32) & 0x10) != 0 || !*(_QWORD *)v3) && *(_DWORD *)(v3 + 16) != -1073739512 )
          *(_DWORD *)(v3 + 16) = -1073741800;
      }
      v3 += 64i64;
    }
    while( v3 - 40 < a2 );
    if( v2 )
      PnpRequestDeviceAction(0i64, AssignResources, 0, 0i64, 0i64, 0i64);
  }
}

Referenced by:

PnpAllocateResources