PnpGetResourceRequirementsForAssignTable

VOID __stdcall PnpGetResourceRequirementsForAssignTable(
        _PNP_RESOURCE_REQUEST *RequestTable,
        _PNP_RESOURCE_REQUEST *RequestTableEnd,
        UINT64 *DeviceCount,
        INT64 a4){
  _IO_RESOURCE_REQUIREMENTS_LIST **p_ResourceRequirements; 
  int v7; 
  __int64 *v8; 
  __int64 v9; 
  __int64 v10; 
  _IO_RESOURCE_REQUIREMENTS_LIST *v11; 
  int v12; 
  void *v13; 
  int v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned int v17; 
  void *v18; 
  UINT64 v19; 
  UINT64 ExactMatch; 
  _IO_RESOURCE_REQUIREMENTS_LIST *FilteredList; 
  LODWORD(v19) = 0;
  LODWORD(ExactMatch) = 0;
  FilteredList = 0i64;
  *(_DWORD *)DeviceCount = 0;
  if( RequestTable < RequestTableEnd )
  {
    p_ResourceRequirements = &RequestTable->ResourceRequirements;
    while( 1 )
    {
      v7 = *((_DWORD *)p_ResourceRequirements - 4);
      v8 = (__int64 *)(p_ResourceRequirements + 1);
      p_ResourceRequirements[1] = 0i64;
      if( (v7 & 0x20) == 0 )
        break;
LABEL_13:
      p_ResourceRequirements += 8;
      if( p_ResourceRequirements - 3 >= (_IO_RESOURCE_REQUIREMENTS_LIST **)RequestTableEnd )
        return;
    }
    p_ResourceRequirements[2] = 0i64;
    v9 = (__int64)*(p_ResourceRequirements - 3);
    p_ResourceRequirements[3] = 0i64;
    if( v9 )
      v10 = *(_QWORD *)(*(_QWORD *)(v9 + 312) + 40i64);
    else
      v10 = 0i64;
    ExAcquireFastMutex(&PiResourceListLock);
    if( (*(_DWORD *)(v10 + 396) & 0x400) != 0 )
    {
      v18 = *(void **)(v10 + 440);
      if( v18 )
      {
        ExFreePoolWithTag(v18, 0);
        *(_QWORD *)(v10 + 440) = 0i64;
        PipClearDevNodeFlags((_DEVICE_NODE *)v10, 0x200ui64);
        *((_DWORD *)p_ResourceRequirements - 4) |= 0x400u;
      }
    }
    KeReleaseGuardedMutex(&PiResourceListLock);
    if( !*p_ResourceRequirements )
    {
      v11 = *(_IO_RESOURCE_REQUIREMENTS_LIST **)(v10 + 440);
      if( !v11 || (*(_DWORD *)(v10 + 396) & 0x200) != 0 )
      {
        IopQueryDeviceResources(
          (_DEVICE_OBJECT *)*(p_ResourceRequirements - 3),
          1ui64,
          (PVOID *)p_ResourceRequirements,
          &v19);
        if( v12 < 0 || !*p_ResourceRequirements )
        {
          *((_DWORD *)p_ResourceRequirements + 8) = v12;
LABEL_12:
          *((_DWORD *)p_ResourceRequirements - 4) |= 0x20u;
          goto LABEL_13;
        }
        ExAcquireFastMutex(&PiResourceListLock);
        v13 = *(void **)(v10 + 440);
        if( v13 )
        {
          ExFreePoolWithTag(v13, 0);
          PipClearDevNodeFlags((_DEVICE_NODE *)v10, 0x200ui64);
        }
        *(_QWORD *)(v10 + 440) = *p_ResourceRequirements;
        KeReleaseGuardedMutex(&PiResourceListLock);
      }
      else
      {
        *p_ResourceRequirements = v11;
        *((_DWORD *)p_ResourceRequirements - 3) = 4;
      }
    }
    if( (*(_DWORD *)(p_ResourceRequirements - 2) & 0x200) != 0 )
    {
      if( (int)PnpFilterResourceRequirementsList(
                  *p_ResourceRequirements,
                  *(_CM_RESOURCE_LIST **)(v10 + 416),
                  &FilteredList,
                  &ExactMatch) >= 0
        && FilteredList )
      {
        *p_ResourceRequirements = FilteredList;
      }
      else
      {
        *((_DWORD *)p_ResourceRequirements - 4) &= ~0x200u;
      }
    }
    v14 = IopResourceRequirementsListToReqList((INT64)(p_ResourceRequirements - 3), (CHAR **)p_ResourceRequirements + 1);
    if( v14 >= 0 )
    {
      v15 = *v8;
      if( *v8 )
      {
        IopRearrangeReqList(*v8);
        if( *(_QWORD *)(v15 + 24) )
        {
          v16 = *(_DWORD *)(v15 + 32);
          v17 = 0;
          *((_DWORD *)p_ResourceRequirements + 8) = v14;
          if( v16 >= 3 )
            v17 = v16;
          ++*(_DWORD *)DeviceCount;
          *((_DWORD *)p_ResourceRequirements - 2) = v17;
          goto LABEL_13;
        }
        PnpFreeResourceRequirementsForAssignTable(
          (_PNP_RESOURCE_REQUEST *)(p_ResourceRequirements - 3),
          (_PNP_RESOURCE_REQUEST *)(p_ResourceRequirements + 5));
        v14 = -1073741438;
      }
    }
    *((_DWORD *)p_ResourceRequirements + 8) = v14;
    goto LABEL_12;
  }
}

Referenced by:

PnpAllocateResources
PnpQueryRebalanceWorker
PnpReallocateResources