Partager via


structure IO_RESOURCE_REQUIREMENTS_LIST (miniport.h)

La structure IO_RESOURCE_REQUIREMENTS_LIST décrit les ensembles de configurations de ressources qui peuvent être utilisés par un appareil. Chaque configuration représente une plage de ressources brutes, de différents types, qui peuvent être utilisées par un appareil.

Syntaxe

typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
  ULONG            ListSize;
  INTERFACE_TYPE   InterfaceType;
  ULONG            BusNumber;
  ULONG            SlotNumber;
  ULONG            Reserved[3];
  ULONG            AlternativeLists;
  IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;

Membres

ListSize

Nombre total d’octets qui constituent la structure IO_RESOURCE_REQUIREMENTS_LIST, son tableau IO_RESOURCE_LIST et le tableau IO_RESOURCE_DESCRIPTOR de ce dernier.

InterfaceType

Spécifie un type d’interface. Il doit s’agir de l’un des types définis par INTERFACE_TYPE, dans Wdm.h ou Ntddk.h. (Non utilisé par les pilotes WDM.)

BusNumber

Numéro de bus basé sur zéro attribué par le système. (Non utilisé par les pilotes WDM.)

SlotNumber

Numéro d’emplacement système. (Non utilisé par les pilotes WDM.)

Reserved[3]

Non utilisé.

AlternativeLists

Nombre de listes alternatives (ou configurations) de ressources matérielles décrites par cette structure IO_RESOURCE_REQUIREMENTS_LIST. Le membre Liste est l’en-tête de la première liste alternative.

List[1]

Structure IO_RESOURCE_LIST qui sert d’en-tête pour la première liste alternative de ressources matérielles. Si la structure IO_RESOURCE_REQUIREMENTS_LIST décrit plusieurs listes alternatives, la deuxième liste alternative suit immédiatement la première liste alternative en mémoire, et ainsi de suite. La taille de chaque liste alternative dépend de la longueur du tableau IO_RESOURCE_DESCRIPTOR qu’il contient. Pour plus d’informations, consultez la section Remarques suivante.

Remarques

Cette structure est utilisée par les IRP_MN_FILTER_RESOURCE_REQUIREMENTS et les IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRPs pour décrire une ou plusieurs configurations alternatives de ressources matérielles .

La structure IO_RESOURCE_REQUIREMENTS_LIST est un en-tête pour une structure de données plus grande, de taille variable, qui spécifie une ou plusieurs listes alternatives de ressources. Toutes les données de cette structure plus grande occupent un bloc de mémoire contigu, dont la taille est spécifiée par le membre ListSize. Chaque liste alternative occupe un sous-bloc dans le bloc le plus grand.

Chaque liste alternative commence par une structure IO_RESOURCE_LIST, qui sert d’en-tête pour un tableau de structures IO_RESOURCE_DESCRIPTOR. La longueur de ce tableau détermine la taille de la liste, qui peut varier d’une autre liste à la suivante. Le code du pilote peut utiliser l’arithmétique du pointeur pour passer d’une liste alternative à la suivante. Par exemple, si un paramètre nommé liste est un pointeur vers la structure IO_RESOURCE_LIST au début d’une liste alternative, liste peut être mis à jour pour pointer vers le début de la liste suivante comme suit :

list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);

Dans cet exemple, list->Descriptors est un pointeur vers le début du tableau IO_RESOURCE_DESCRIPTOR et list->Count correspond au nombre d’éléments du tableau. Pour plus d’informations sur les descripteurs et les membres Count, consultez IO_RESOURCE_LIST.

Exemples

Si un pilote contient un gestionnaire pour un IRP IRP_MN_FILTER_RESOURCE_REQUIREMENTS, le gestionnaire guide généralement la liste des ressources pointée par le champ IoStatus.Information dans l’IRP. L’exemple de code suivant contient une fonction nommée FilterResources, appelée dans le gestionnaire pour parcourir la liste. Cette fonction vérifie qu’une ressource particulière est spécifiée dans la liste ou modifie les besoins en ressources de la liste sans modifier la taille de la liste. (Une fonction qui modifie la taille de la liste doit allouer une mémoire tampon pour la liste mise à jour, écrire la liste dans cette mémoire tampon, mettre à jour le champ IoStatus.Information dans l’IRP pour pointer vers la liste mise à jour et libérer la mémoire tampon qui contient la liste d’origine.)

La fonction FilterResources retourne TRUE (probablement à partir de l’instruction switch, bien que les détails soient omis pour simplifier l’exemple de code) s’il trouve la ressource qu’elle recherche dans la liste, ou si elle apporte une modification à la liste qui ne modifie pas la taille de la liste. Sinon, elle retourne FALSE.

/* Modify the resource list in place (without changing its size). */

BOOLEAN FilterResources(PIO_RESOURCE_REQUIREMENTS_LIST reqlist)
{
    PIO_RESOURCE_LIST list;

    list = reqlist->List;

    for (int ix = 0; ix < reqlist->AlternativeLists; ++ix)
    {
        /* Process resources in IO_RESOURCE_LIST block number ix. */

        for (int jx = 0; jx < list->Count; ++jx)
        {
            PIO_RESOURCE_DESCRIPTOR desc; 

            desc = list->Descriptors + jx;

            switch (desc->Type)
            {
               /* Process element jx in Descriptors array. */

               ...

            }
        }

        /* Advance to next IO_RESOURCE_LIST block in memory. */

        list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
    }

    return FALSE;
}

Exigences

Exigence Valeur
d’en-tête miniport.h (include Wdm.h, Ntddk.h, Ntifs.h, Miniport.h)

Voir aussi

IO_RESOURCE_DESCRIPTOR

IO_RESOURCE_LIST

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

IRP_MN_QUERY_RESOURCE_REQUIREMENTS