IRP_MN_QUERY_CAPABILITIES
Le gestionnaire PnP envoie cet IRP pour obtenir les fonctionnalités d’un appareil, par exemple si l’appareil peut être verrouillé ou éjecté.
Les pilotes de fonction et de filtre peuvent gérer cette requête s’ils modifient les fonctionnalités prises en charge par le pilote de bus. Les pilotes de bus doivent gérer cette demande pour leurs appareils enfants.
Valeur
0x09
Code principal
Moment de l’envoi
Le gestionnaire PnP envoie cet IRP au pilote de bus pour un appareil immédiatement après l’énumération de l’appareil. Le gestionnaire PnP envoie à nouveau cet IRP une fois que tous les pilotes d’un appareil ont démarré l’appareil. Un pilote peut envoyer cet IRP pour obtenir les fonctionnalités d’un appareil.
Le gestionnaire pnP et les pilotes envoient cet IRP au PASSIVE_LEVEL IRQL dans un contexte de thread arbitraire.
Paramètres d’entrée
Le membre Parameters.DeviceCapabilities.Capabilities de la structure IO_STACK_LOCATION pointe vers une structure DEVICE_CAPABILITIES contenant des informations sur les fonctionnalités de l’appareil.
Paramètres de sortie
Parameters.DeviceCapabilities.Capabilities pointe vers la structure DEVICE_CAPABILITIES qui reflète les modifications apportées par les pilotes qui gèrent l’IRP.
Bloc d’état d’E/S
Un pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur un état d’erreur approprié tel que STATUS_UNSUCCESSFUL.
Si une fonction ou un pilote de filtre ne gère pas cet IRP, il appelle IoSkipCurrentIrpStackLocation et transmet le IRP au pilote suivant. Un tel pilote ne doit pas modifier Irp-IoStatus.Status> et ne doit pas terminer l’IRP.
Un pilote de bus définit Irp-IoStatus.Status> et termine l’IRP.
Operation
Lorsqu’un appareil est énuméré, mais avant le chargement des pilotes de fonction et de filtre pour l’appareil, le gestionnaire PnP envoie une demande de IRP_MN_QUERY_CAPABILITIES au pilote de bus parent pour l’appareil. Le pilote de bus doit définir les valeurs pertinentes dans la structure DEVICE_CAPABILITIES et le retourner au gestionnaire PnP.
Une fois la pile d’appareils générée et les pilotes ont démarré l’appareil, le gestionnaire PnP envoie à nouveau cet IRP pour être géré en premier par le pilote en haut de la pile d’appareils, puis par chaque pilote inférieur dans la pile. Les pilotes de fonction et de filtre peuvent définir une routine IoCompletion et gérer cet IRP sur son chemin de sauvegarde de la pile d’appareils.
Les pilotes doivent ajouter des fonctionnalités avant de passer l’IRP au pilote inférieur suivant.
Les pilotes doivent supprimer des fonctionnalités une fois que tous les pilotes inférieurs ont terminé avec l’IRP. Un pilote ne supprime généralement pas les fonctionnalités qui ont été définies par d’autres pilotes, mais il peut le faire s’il contient des informations spéciales sur les fonctionnalités de l’appareil dans une certaine configuration. Consultez Plug-and-Play pour plus d’informations sur le postponing du traitement IRP jusqu’à ce que les pilotes inférieurs aient terminé.
Une fois qu’un appareil est énuméré et que ses pilotes sont chargés, ses fonctionnalités ne doivent pas changer. Les fonctionnalités d’un appareil peuvent changer si l’appareil est supprimé et réinscrit.
Lors de la gestion d’un IRP IRP_MN_QUERY_CAPABILITIES , le pilote qui est le gestionnaire de stratégie d’alimentation de l’appareil doit définir une routine IoCompletion et copier les fonctionnalités d’alimentation de l’appareil, telles que les mappages d’état d’alimentation S-to-D, sur la façon de sauvegarder la pile d’appareils. Pour déterminer les fonctionnalités d’alimentation d’un appareil enfant, le pilote de bus parent crée un autre IRP de fonctionnalités de requête et envoie l’IRP à son pilote parent. Pour plus d’informations, consultez Fonctionnalités d’alimentation de l’appareil de création de rapports.
Si un pilote gère cet IRP, il doit vérifier la valeur DEVICE_CAPABILITIES Version . Si cette valeur n’est pas une version prise en charge par le pilote, le pilote doit échouer à l’IRP. Si la version est prise en charge, le pilote doit vérifier le champ Taille . Un pilote doit définir uniquement les champs qui se trouvent dans les limites de la structure des fonctionnalités qu’il a reçue comme entrée.
Les pilotes qui gèrent cet IRP peuvent définir certains champs DEVICE_CAPABILITIES , mais ne doivent pas définir les champs Taille et Version . Ces champs sont définis uniquement par le composant qui a envoyé l’IRP.
Consultez Plug-and-Play pour connaître les règles générales relatives à la gestion des Plug-and-Play fournisseurs d’intégration secondaires.
Envoi de cet IRP
Un pilote de bus envoie cet IRP à la pile d’appareils parent lorsqu’il gère une demande de IRP_MN_QUERY_CAPABILITIES pour l’un de ses appareils enfants. En outre, un pilote peut envoyer cet IRP pour obtenir les fonctionnalités de l’appareil pour l’un de ses appareils. Un seul pilote dans la pile ne contient que des informations sur les fonctionnalités de l’appareil ; l’envoi d’un IRP à la pile d’appareils lui permet de rassembler l’image complète, y compris les modifications apportées par les pilotes de filtre, etc.
Pour plus d’informations sur l’envoi d’irps, consultez Gestion des irps . Les étapes suivantes s’appliquent spécifiquement à ce protocole IRP :
Allouez une structure DEVICE_CAPABILITIES du pool paginé et initialisez-la à zéro en appelant RtlZeroMemory. Initialisez la taille sur sizeof(DEVICE_CAPABILITIES), la version sur 1 et l’adresse et le numéro d’interface utilisateur sur -1.
Définissez les valeurs dans l’emplacement de pile d’E/S suivant de l’IRP : définissez MajorFunction sur IRP_MJ_PNP, définissez MinorFunction sur IRP_MN_QUERY_CAPABILITIES et définissez Parameters.DeviceCapabilities sur un pointeur vers la structure de DEVICE_CAPABILITIES allouée.
Initialisez IoStatus.Status sur STATUS_NOT_SUPPORTED.
Libérez l’IRP et la structure DEVICE_CAPABILITIES lorsqu’elles ne sont plus nécessaires.
Spécifications
En-tête |
Wdm.h (include Wdm.h, Ntddk.h ou Ntifs.h) |