Partager via


IRP_MN_QUERY_ID

Les pilotes de bus doivent gérer les demandes de BusQueryDeviceID pour leurs appareils enfants (PPO enfants). Les pilotes de bus peuvent gérer les demandes de BusQueryHardwareIDs, BusQueryCompatibleIDs et BusQueryInstanceID pour leurs appareils enfants.

À compter de Windows 7, les pilotes de bus doivent également gérer les demandes de BusQueryContainerID pour leurs PDO enfants.

Pour plus d’informations sur ces identificateurs (ID), consultez Chaînes d’identification des appareils.

Note Les pilotes de fonction et les pilotes de filtre ne gèrent pas cette IRP.

Valeur

0x13

Code majeur

IRP_MJ_PNP

Date d’envoi

Le gestionnaire PnP envoie cette IRP lorsqu’un appareil est énuméré. Un pilote peut envoyer cette IRP pour récupérer l’ID de instance de l’un de ses appareils.

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.QueryId.IdType de la structure IO_STACK_LOCATION spécifie le type d’ID demandé. Les valeurs possibles incluent BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID et BusQueryContainerID. Le type d’ID suivant est réservé : BusQueryDeviceSerialNumber.

Paramètres de sortie

Retourné dans le bloc de status d’E/S.

Bloc d’état E/S

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

En cas de réussite, un pilote définit Irp-IoStatus.Information> sur un pointeur WCHAR qui pointe vers les informations demandées. En cas d’erreur, un pilote définit Irp-IoStatus.Information> sur zéro.

Opération

Si un pilote retourne des ID en réponse à cette IRP, il alloue une structure WCHAR à partir d’un pool paginé pour contenir le ou les ID. Le gestionnaire PnP libère la structure quand elle n’est plus nécessaire.

Un pilote retourne l’une des opérations suivantes :

  • Une chaîne REG_SZ en réponse à une requête BusQueryDeviceID, BusQueryInstanceID ou BusQueryContainerID.

  • Une chaîne REG_MULTI_SZ en réponse à une requête BusQueryHardwareIDs ou BusQueryCompatibleIDs.

Si un pilote retourne un ID avec un caractère non conforme, le système bogue case activée. Les caractères avec les valeurs suivantes ne sont pas valides dans un ID pour cette IRP :

  • Inférieur ou égal à 0x20 (' ')

  • Supérieur à 0x7F

  • Égal à 0x2C (',')

Un pilote doit se conformer aux restrictions de longueur suivantes pour les ID :

  • Chaque ID matériel ou ID compatible qu’un pilote retourne dans cette IRP doit comporter moins de MAX_DEVICE_ID_LEN caractères. Cette constante a actuellement une valeur de 200, comme défini dans sdk\inc\cfgmgr32.h.

  • L’ID de conteneur qu’un pilote retourne dans cette IRP doit être mis en forme en tant qu’identificateur global unique (GUID) et doit être MAX_GUID_STRING_LEN caractères, y compris le terminateur Null.

  • Si un pilote de bus fournit des ID de instance uniques à l’échelle mondiale pour ses appareils enfants (autrement dit, le pilote définit DEVICE_CAPABILITIES. UniqueID pour les appareils), la combinaison de l’ID d’appareil et de l’ID de instance doit être inférieure à (MAX_DEVICE_ID_LEN - 1). Le système d’exploitation nécessite le caractère supplémentaire pour un séparateur de chemin d’accès.

  • Si un pilote de bus ne fournit pas d’ID de instance globalement uniques pour ses appareils enfants, la combinaison de l’ID d’appareil et de l’ID de instance doit être inférieure à (MAX_DEVICE_ID_LEN - 28). La valeur de cette équation est actuellement 172.

Les pilotes de bus doivent être prêts à gérer cette IRP pour un appareil enfant immédiatement après l’énumération de l’appareil.

Spécification de BusQueryDeviceID et BusQueryInstanceID

Les valeurs qu’un pilote de bus fournit pour BusQueryDeviceID et BusQueryInstanceID permettent au système d’exploitation de différencier un appareil des autres appareils de l’ordinateur. Le système d’exploitation utilise l’ID d’appareil et l’ID de instance qui sont retournés dans l’IRP IRP_MN_QUERY_ID et le champ ID unique retournés dans le IRP_MN_QUERY_CAPABILITIES IRP pour localiser les informations de Registre de l’appareil.

Pour BusQueryDeviceID, un pilote de bus fournit l’ID de périphérique de l’appareil. Un ID d’appareil doit contenir la description la plus spécifique possible de l’appareil, en incluant le nom de l’énumérateur et des chaînes identifiant le fabricant, l’appareil, la révision, l’empaqueteur et le produit empaqueté, si possible. Par exemple, le pilote de bus PCI répond avec des ID de périphérique au format PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, encodant les cinq éléments mentionnés ci-dessus. Toutefois, un ID d’appareil ne doit pas contenir suffisamment d’informations pour différencier deux appareils identiques. Ces informations doivent être encodées dans l’ID de instance.

Pour BusQueryInstanceID, un pilote de bus doit fournir une chaîne qui contient l’ID de instance de l’appareil. Les pilotes d’installation et de bus utilisent l’ID instance, avec d’autres informations, pour différencier deux appareils identiques sur l’ordinateur. L’ID de instance est unique sur l’ensemble de l’ordinateur ou simplement unique sur le bus parent de l’appareil.

Si un ID de instance est unique uniquement sur le bus, le pilote de bus spécifie cette chaîne pour BusQueryInstanceID, mais spécifie également une valeur UniqueIDfalse en réponse à une demande de IRP_MN_QUERY_CAPABILITIES pour l’appareil. Si UniqueID a la valeur FALSE, le gestionnaire PnP améliore l’ID de instance en ajoutant des informations sur le parent de l’appareil et rend ainsi l’ID unique sur l’ordinateur. Dans ce cas, le pilote de bus ne doit pas prendre de mesures supplémentaires pour rendre les ID de instance de ses appareils globalement uniques ; il suffit de retourner les informations de fonctionnalités appropriées et le système d’exploitation s’en charge.

Si un pilote de bus peut fournir un ID global unique pour chaque appareil enfant, tel qu’un numéro de série, le pilote de bus spécifie ces chaînes pour BusQueryInstanceID et spécifie une valeur UniqueIDtrue en réponse à une demande de IRP_MN_QUERY_CAPABILITIES pour chaque appareil.

Spécification de BusQueryHardwareIDs et BusQueryCompatibleIDs

Les valeurs qu’un pilote de bus fournit pour BusQueryHardwareIDs et BusQueryCompatibleIDs permettent au programme d’installation de localiser les pilotes appropriés pour l’appareil enfant du bus.

Un pilote de bus répond à chacune de ces demandes avec une liste REG_MULTI_SZ d’ID qui décrivent l’appareil. La longueur maximale, en caractères, d’une liste d’ID, y compris les deux caractères NULL qui terminent la liste, est REGSTR_VAL_MAX_HCID_LEN.

Lorsque vous retournez plusieurs ID matériels et/ou plusieurs ID compatibles, un pilote de bus doit répertorier les ID dans l’ordre le plus spécifique au plus général pour faciliter le choix de la meilleure correspondance de pilote pour l’appareil. La première entrée de la liste des ID matériels est la description la plus spécifique de l’appareil et, par conséquent, elle est généralement identique à l’ID de l’appareil.

Le programme d’installation vérifie les ID par rapport aux ID répertoriés dans les fichiers INF pour les correspondances possibles. Le programme d’installation analyse d’abord la liste des ID matériels, puis la liste des ID compatibles. Les entrées antérieures sont traitées comme des descriptions plus spécifiques de l’appareil, et les entrées ultérieures comme des correspondances plus générales (et donc moins optimales) pour l’appareil. Si aucune correspondance n’est trouvée dans la liste des ID matériels, le programme d’installation peut inviter l’utilisateur à entrer un support d’installation avant de passer à la liste des ID compatibles.

Consultez Plug-and-Play pour connaître les règles générales de gestion Plug-and-Play irps mineurs.

Spécification de BusQueryContainerIDs

À compter de Windows 7, un pilote de bus doit fournir une chaîne pour BusQueryContainerID qui contient l’ID de conteneur de l’appareil. L’ID de conteneur permet au système d’exploitation de regrouper tous les appareils fonctionnels à partir d’un seul appareil physique amovible. Par exemple, tous les appareils fonctionnels d’un appareil multifonction amovible ont le même ID de conteneur. Pour plus d’informations sur la création de rapports d’ID de conteneur dans des cas spéciaux, tels qu’un périphérique de volume qui peut s’étendre sur plusieurs disques dans plusieurs conteneurs mais n’appartient à aucun conteneur, consultez Vue d’ensemble des ID de conteneur.

Un périphérique physique amovible est défini comme un appareil enfant que le pilote de bus spécifie une fonctionnalité amovibletrue en réponse à une demande de IRP_MN_QUERY_CAPABILITIES . Pour plus d’informations sur la valeur Amovible , consultez DEVICE_CAPABILITIES.

Le pilote de bus crée un ID de conteneur basé sur un ID unique spécifique au bus fourni par l’appareil. Pour plus d’informations, consultez Comment les ID de conteneur sont générés.

Le pilote doit échouer à la requête IRP et définir IoStatus.Status sur STATUS_NOT_SUPPORTED si l’une des conditions suivantes est remplie :

  • L’appareil ne prend pas en charge un ID unique spécifique au bus que le pilote de bus peut utiliser pour générer un ID de conteneur.

  • Le pilote de bus avait précédemment spécifié une fonctionnalité amoviblefalse en réponse à une demande de IRP_MN_QUERY_CAPABILITIES pour l’appareil.

Envoi de cette IRP

En règle générale, seul le gestionnaire PnP envoie cette IRP.

Pour obtenir les ID matériels ou les ID compatibles d’un appareil, appelez IoGetDeviceProperty au lieu d’envoyer cet IRP.

Un pilote peut envoyer cette IRP pour récupérer l’ID de instance de l’un de ses appareils. Par exemple, prenons l’exemple d’un appareil ISA PnP multifonction dont les fonctions ne fonctionnent pas indépendamment. Le gestionnaire PnP énumère les fonctions en tant qu’appareils distincts, mais le pilote d’un tel appareil peut être amené à associer une ou plusieurs des fonctions. Étant donné que PnP ISA garantit un ID de instance unique, le pilote d’un tel appareil multifonction peut utiliser les ID de instance pour localiser les fonctions qui résident sur le même appareil. Le pilote d’un tel appareil doit également obtenir le nom de l’énumérateur de l’appareil en appelant IoGetDeviceProperty, pour confirmer qu’il s’agit d’un appareil PnP ISA.

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

  • 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_ID et définissez Parameters.QueryId.IdType sur BusQueryInstanceID.

  • Définissez IoStatus.Status sur STATUS_NOT_SUPPORTED.

En plus d’envoyer l’IRP de l’ID de requête, le pilote doit appeler IoGetDeviceProperty pour obtenir devicePropertyEnumeratorName pour l’appareil.

Une fois l’IRP terminée et que le pilote a terminé l’ID, le pilote doit libérer la structure d’ID retournée par le ou les pilotes qui ont géré l’IRP de requête.

Configuration requise

En-tête

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

Voir aussi

Chaînes d’identification d’appareil

IoGetDeviceProperty