Partager via


CM_RESOURCE_LIST structure (wdm.h)

La structure CM_RESOURCE_LIST spécifie toutes les ressources matérielles système affectées à un appareil.

Syntaxe

typedef struct _CM_RESOURCE_LIST {
  ULONG                       Count;
  CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;

Membres

Count

Nombre de descripteurs de ressources complets spécifiés par cette structure CM_RESOURCE_LIST . Le membre List est l’en-tête du premier descripteur de ressource complet. Pour les pilotes WDM, Count est toujours 1.

List[1]

Le CM_FULL_RESOURCE_DESCRIPTOR structure qui sert d’en-tête pour le premier descripteur de ressources complet. Si la structure CM_RESOURCE_LIST contient plusieurs descripteurs de ressources complets, le deuxième descripteur de ressources complet suit immédiatement le premier en mémoire, et ainsi de suite. La taille de chaque descripteur de ressources complet dépend de la longueur du tableau CM_PARTIAL_RESOURCE_DESCRIPTOR qu’il contient. Pour plus d'informations, consultez la section Notes qui suit.

Remarques

Cette structure décrit l’affectation de ressources matérielles à un appareil. Une IRP IRP_MN_START_DEVICE utilise cette structure pour spécifier les ressources que le gestionnaire de Plug-and-Play affecte à un appareil. Les pilotes des appareils hérités utilisent cette structure pour transmettre leurs besoins en ressources à la routine IoReportResourceForDetection . Pour plus d’informations sur l’allocation de ressources matérielles, consultez Ressources matérielles.

La structure CM_RESOURCE_LIST est un en-tête pour une structure de données plus grande, de taille variable, qui contient un ou plusieurs descripteurs de ressources complets. Toutes les données de cette structure plus grande occupent un bloc contigu de mémoire. Chaque descripteur de ressources complet occupe un sous-bloc dans le bloc plus grand.

Un descripteur de ressources complet commence par une structure CM_FULL_RESOURCE_DESCRIPTOR , qui sert d’en-tête pour un tableau de structures CM_PARTIAL_RESOURCE_DESCRIPTOR . La longueur de ce tableau détermine la taille du descripteur de ressources complet. Le dernier membre de la structure CM_FULL_RESOURCE_DESCRIPTOR est une structure CM_PARTIAL_RESOURCE_LIST qui contient, en tant que dernier membre, le premier élément de ce tableau. Si le tableau contient plusieurs éléments, les éléments restants suivent immédiatement, en mémoire, la fin de la structure CM_PARTIAL_RESOURCE_LIST , qui est également la fin de la structure CM_FULL_RESOURCE_DESCRIPTOR .

Le code du pilote peut utiliser l’arithmétique du pointeur pour passer d’un descripteur de ressources complet au suivant. Par exemple, si un paramètre nommé list est un pointeur vers la structure CM_FULL_RESOURCE_DESCRIPTOR au début d’un descripteur de ressources complet, la liste peut être mise à jour pour pointer vers le début du descripteur de ressources complet suivant comme suit :

list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
                                        list->PartialResourceList.Count);

Dans cet exemple, list->PartialResourceList.PartialDescriptors est un pointeur vers le début du tableau CM_PARTIAL_RESOURCE_DESCRIPTOR et list->PartialResourceList.Count est le nombre d’éléments dans le tableau. Pour plus d’informations sur les membres PartialDescriptors et Count , consultez CM_PARTIAL_RESOURCE_LIST.

Exemples

Tous les pilotes PnP doivent gérer IRP_MN_START_DEVICE IRP. En règle générale, un gestionnaire de pilote pour cette IRP décrit les listes de ressources affectées qui sont pointées par les membres Parameters.StartDevice.AllocatedResources et Parameters.StartDevice.AllocatedResourcesTranslated de la structure IO_STACK_LOCATION dans l’IRP. L’exemple de code suivant contient une fonction nommée GetAssignedResources appelée dans le gestionnaire pour parcourir chaque liste. Cette fonction vérifie que les ressources requises sont spécifiées dans la liste et configure l’appareil pour qu’il utilise les ressources.

La fonction GetAssignedResources retourne TRUE si elle réussit. Sinon, elle retourne FALSE (probablement à partir de l’instruction switch , bien que les détails soient omis pour simplifier l’exemple de code).

/* Process the assigned hardware resources. */

BOOLEAN GetAssignedResources(PCM_RESOURCE_LIST reslist)
{
    PCM_FULL_RESOURCE_DESCRIPTOR list;

    list = reslist->List;

    for (int ix = 0; ix < reslist->Count; ++ix)
    {
        /* Process resources in CM_FULL_RESOURCE_DESCRIPTOR block number ix. */

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

            desc = list->PartialResourceList.PartialDescriptors + jx;

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

                ...

            }
        }

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

        list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors + 
                                              list->PartialResourceList.Count);
    }

    return TRUE;
}

Configuration requise

Condition requise Valeur
En-tête wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h)

Voir aussi

CM_FLOPPY_DEVICE_DATA

CM_FULL_RESOURCE_DESCRIPTOR

CM_KEYBOARD_DEVICE_DATA

CM_PARTIAL_RESOURCE_LIST

CM_RESOURCE_LIST

CM_SCSI_DEVICE_DATA

CM_SERIAL_DEVICE_DATA

IRP_MN_START_DEVICE

IoConnectInterrupt

IoGetDeviceProperty

IoReportResourceForDetection