IRP_MN_QUERY_CAPABILITIES

Le gestionnaire PnP envoie cette 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 demande 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 majeur

IRP_MJ_PNP

Date d’envoi

Le gestionnaire PnP envoie cette IRP au pilote de bus pour un appareil immédiatement après l’énumération de l’appareil. Le gestionnaire PnP envoie à nouveau cette IRP une fois que tous les pilotes d’un appareil ont démarré l’appareil. Un pilote peut envoyer cette IRP pour obtenir les fonctionnalités d’un appareil.

Le gestionnaire pnP et les pilotes envoient cette IRP à IRQL PASSIVE_LEVEL 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 toutes les modifications apportées par les pilotes qui gèrent l’IRP.

Bloc d’état E/S

Un pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur un status d’erreur approprié, comme STATUS_UNSUCCESSFUL.

Si un pilote de fonction ou de filtre ne gère pas cette IRP, il appelle IoSkipCurrentIrpStackLocation et transmet l’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.

Opération

Lorsqu’un appareil est énuméré, mais avant que les pilotes de fonction et de filtre ne soient chargés pour l’appareil, le gestionnaire PnP envoie une requête IRP_MN_QUERY_CAPABILITIES au pilote de bus parent pour l’appareil. Le pilote de bus doit définir toutes les valeurs pertinentes dans la structure DEVICE_CAPABILITIES et les retourner au gestionnaire PnP.

Une fois que la pile de périphériques est générée et que les pilotes ont démarré l’appareil, le gestionnaire PnP envoie à nouveau cette IRP pour être gérée d’abord par le pilote en haut de la pile de périphériques, puis par chaque pilote inférieur de la pile. Les pilotes de fonction et de filtre peuvent définir une routine IoCompletion et gérer cette IRP lors de la sauvegarde de la pile des appareils.

Les pilotes doivent ajouter des fonctionnalités avant de passer l’IRP au pilote inférieur suivant.

Les pilotes doivent supprimer les fonctionnalités une fois que tous les pilotes inférieurs ont terminé 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 dispose d’informations spéciales sur les fonctionnalités de l’appareil dans une certaine configuration. Consultez Plug-and-Play pour plus d’informations sur le report du traitement IRP jusqu’à la fin des pilotes inférieurs.

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’une IRP IRP_MN_QUERY_CAPABILITIES , le pilote qui est le gestionnaire de stratégie d’alimentation pour 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-à-D, sur le chemin de sauvegarde de la pile des appareils iRP. Pour déterminer les capacité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 Création de rapports sur les fonctionnalités d’alimentation des appareils.

Si un pilote gère cette IRP, il doit case activée la valeur DEVICE_CAPABILITIESVersion. 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 case activée le champ Taille. Un pilote doit définir uniquement les champs qui se trouvent dans les limites de la structure de fonctionnalités qu’il a reçue en tant qu’entrée.

Les pilotes qui gèrent cette 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 de gestion Plug-and-Play irps mineurs.

Envoi de cette IRP

Un pilote de bus envoie cette IRP à la pile de périphériques 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 cette IRP pour obtenir les fonctionnalités de l’un de ses appareils. Un pilote unique dans la pile n’a qu’une partie des informations sur les fonctionnalités de l’appareil ; L’envoi d’un IRP à la pile d’appareils lui permet de recueillir l’image complète, y compris les modifications apportées par les pilotes de filtre, etc.

Pour plus d’informations sur l’envoi des IRP, consultez Gestion des irps . Les étapes suivantes s’appliquent spécifiquement à cette IRP :

  • Allouez une structure DEVICE_CAPABILITIES à partir d’un pool paginé et initialisez-la à zéros en appelant RtlZeroMemory. Initialisez la taille à 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 MajorFunctionsur IRP_MJ_PNP, définissez MinorFunctionsur 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 quand ils ne sont plus nécessaires.

Spécifications

En-tête

Wdm.h (inclure Wdm.h, Ntddk.h ou Ntifs.h)

Voir aussi

DEVICE_CAPABILITIES