Partager via


IRP_MN_REGINFO_EX

WMI envoie cette IRP pour interroger ou mettre à jour les informations d’inscription d’un pilote après que le pilote a appelé IoWMIRegistrationControl. Un pilote peut gérer les IRP WMI en appelant WmiSystemControl ou en gérant l’IRP lui-même, comme décrit dans Gestion des demandes WMI.

Si un pilote appelle WmiSystemControl pour gérer une demande de IRP_MN_REGINFO_EX , WMI appelle à son tour la routine DpWmiQueryReginfo de ce pilote.

Sur Microsoft Windows XP et les systèmes d’exploitation ultérieurs, les pilotes qui prennent en charge WMI doivent gérer cette IRP. Les pilotes qui prennent en charge Microsoft Windows 98 et Windows 2000 doivent également gérer IRP_MN_REGINFO.

Code majeur

IRP_MJ_SYSTEM_CONTROL

Date d’envoi

Sur Windows XP et versions ultérieures, WMI envoie cette IRP pour interroger ou mettre à jour les informations d’inscription d’un pilote après que le pilote a appelé IoWMIRegistrationControl. Sur Windows 98 et Windows 2000, WMI envoie la requête IRP_MN_REGINFO à la place.

WMI envoie cette IRP à IRQL = PASSIVE_LEVEL dans le contexte d’un thread système.

Paramètres d’entrée

Parameters.WMI.ProviderId pointe vers l’objet de périphérique du pilote qui doit répondre à la demande. Ce pointeur se trouve à l’emplacement de la pile d’E/S du pilote dans l’IRP.

Parameters.WMI.DataPath est défini sur WMIREGISTER pour interroger les informations d’inscription ou sur WMIUPDATE pour les mettre à jour.

Parameters.WMI.BufferSize indique la taille maximale de la mémoire tampon non paginé sur Parameters.WMI.Buffer. La taille doit être supérieure ou égale au total de (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)), où GuidCount correspond au nombre de blocs de données et de blocs d’événements inscrits par le pilote, plus l’espace pour les noms de instance statiques, le cas échéant.

Paramètres de sortie

Si le pilote gère les IIP WMI en appelant WmiSystemControl, WMI obtient des informations d’inscription pour les blocs de données d’un pilote en appelant sa routine DpWmiQueryReginfo .

Sinon, le pilote remplit une structure WMIREGINFO sur Parameters.WMI.Buffer comme suit :

  • Définit BufferSize sur la taille en octets de la structure WMIREGINFO plus les données d’inscription associées.

  • Si le pilote gère les requêtes WMI pour le compte d’un autre pilote, définit NextWmiRegInfo sur le décalage en octets entre le début de ce WMIREGINFO et le début d’une autre structure WMIREGINFO qui contient les informations d’inscription de l’autre pilote.

  • Définit RegistryPath sur le chemin du Registre qui a été passé à la routine DriverEntry du pilote.

  • Si Parameters.WMI.Datapath a la valeur WMIREGISTER, définit MofResourceName sur le décalage entre le début de ce WMIREGINFO et une chaîne Unicode comptée qui contient le nom de la ressource MOF du pilote dans son fichier image.

  • Définit GuidCount sur le nombre de blocs de données et de blocs d’événements à inscrire ou à mettre à jour.

  • Écrit un tableau de structures WMIREGGUID , une pour chaque bloc de données ou bloc d’événements exposé par le pilote, sur WmiRegGuid.

Le pilote remplit chaque structure WMIREGGUID comme suit :

  • Définit guid sur le GUID qui identifie le bloc.

  • Définit des indicateurs pour fournir des informations sur les noms de instance et d’autres caractéristiques du bloc. Par exemple, si un bloc est inscrit avec des noms de instance statiques, le pilote définit Flags avec l’indicateur WMIREG_FLAG_INSTANCE_XXX approprié.

Si le bloc est inscrit avec des noms de instance statiques, le pilote :

  • Définit InstanceCount sur le nombre d’instances.

  • Définit l’un des membres suivants sur un décalage en octets sur les données de nom statiques instance pour le bloc :

    • Si le pilote définit Flags avec WMIREG_FLAG_INSTANCE_LIST, il définit InstanceNameList sur un décalage sur une liste de chaînes de noms statiques instance. WMI spécifie les instances dans les requêtes suivantes par index dans cette liste.

    • Si le pilote définit Flags avec WMIREG_FLAG_INSTANCE_BASENAME, il définit BaseNameOffset sur un décalage sur une chaîne de nom de base. WMI utilise cette chaîne pour générer des noms de instance statiques pour le bloc.

    • Si le pilote définit Flags avec WMIREG_FLAG_INSTANCE_PDO, il définit Pdo sur un décalage vers un pointeur vers le PDO passé à la routine AddDevice du pilote. WMI utilise le chemin d’accès instance de l’appareil de l’AOP pour générer des noms de instance statiques pour le bloc. Les pilotes doivent appeler ObReferenceObject sur l’objet de périphérique physique passé dans Pdo. Le système appelle automatiquement ObDereferenceObject pour déréférencer l’objet ; le conducteur ne doit pas le faire. (Les pilotes qui utilisent WmiSystemControl pour gérer les IRPs n’ont pas besoin d’appeler ObReferenceObject. WMI le fait automatiquement avant d’appeler la routine DpWmiQueryReginfo du pilote.)

  • Écrit les chaînes de nom instance, la chaîne de nom de base ou un pointeur vers l’AOP au décalage indiqué respectivement par InstanceNameList, BaseName ou Pdo.

Si le pilote gère l’inscription WMI pour le compte d’un autre pilote (par exemple, un pilote miniclasse ou miniport), il remplit une autre structure WMIREGINFO avec les informations d’inscription de l’autre pilote et les écrit dans NextWmiRegInfo dans la structure précédente.

Si la mémoire tampon de Parameters.WMI.Buffer est trop petite pour recevoir toutes les données, un pilote écrit la taille nécessaire en octets en tant que ULONG dans Parameters.WMI.Buffer et échoue à l’IRP et retourne STATUS_BUFFER_TOO_SMALL.

Bloc d’état E/S

Si le pilote gère l’IRP en appelant WmiSystemControl, WMI définit Irp-IoStatus.Status> et Irp-IoStatus.Information> dans le bloc d’E/S status.

Dans le cas contraire, le pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur un status d’erreur approprié, par exemple :

STATUS_BUFFER_TOO_SMALL

En cas de réussite, un pilote définit Irp-IoStatus.Information> sur le nombre d’octets écrits dans la mémoire tampon sur Parameters.WMI.Buffer.

Opération

Si un pilote gère lui-même une requête de IRP_MN_REGINFO_EX , il ne doit le faire que si Parameters.WMI.ProviderId pointe vers le même objet d’appareil que le pointeur que le pilote a passé à IoWMIRegistrationControl. Dans le cas contraire, le pilote doit transférer la demande au pilote inférieur suivant.

Avant de gérer la demande, le pilote doit case activée Parameters.WMI.DataPath pour déterminer si WMI interroge les informations d’inscription (WMIREGISTER) ou demande une mise à jour (WMIUPDATE).

WMI envoie cette IRP avec WMIREGISTER après qu’un pilote a appelé IoWMIRegistrationControl avec WMIREG_ACTION_REGISTER ou WMIREG_ACTION_REREGISTER. En réponse, un pilote doit remplir la mémoire tampon à l’adresse Parameters.WMI.Buffer avec les éléments suivants :

  • Structure WMIREGINFO qui indique le chemin d’accès au Registre du pilote, le nom de sa ressource MOF et le nombre de blocs à inscrire.

  • Une structureWMIREGGUID pour chaque bloc à inscrire. Si un bloc doit être inscrit avec des noms de instance statiques, le pilote définit l’indicateur WMIREG_FLAG_INSTANCE_XXX approprié dans la structure WMIREGGUID pour ce bloc.

  • Toutes les chaînes WMI doivent générer des noms de instance statiques.

WMI envoie cet IRP avec WMIUPDATE après qu’un pilote a appelé IoWmiRegistrationControl avec WMIREG_ACTION_UPDATE_GUIDS. En réponse, un pilote doit remplir la mémoire tampon à l’adresse Parameters.WMI.Buffer avec une structure WMIREGINFO comme suit :

  • Pour supprimer un bloc, le pilote définit WMIREG_FLAG_REMOVE_GUID dans sa structure WMIREGGUID .

  • Pour ajouter ou mettre à jour un bloc (par exemple, pour modifier ses noms de instance statiques), le pilote efface WMIREG_FLAG_REMOVE_GUID et fournit des valeurs d’inscription nouvelles ou mises à jour pour le bloc.

  • Pour inscrire un bloc nouveau ou existant avec des noms de instance statiques, le pilote définit le WMIREG_FLAG_INSTANCE_XXX approprié et fournit toutes les chaînes dont WMI a besoin pour générer des noms de instance statiques.

Un pilote peut utiliser les mêmes structures WMIREGINFO pour supprimer, ajouter ou mettre à jour des blocs qu’au départ pour inscrire tous ses blocs, en modifiant uniquement les indicateurs et les données des blocs à mettre à jour. Si un WMIREGGUID dans une telle structure WMIREGINFO correspond exactement au WMIREGGUID transmis par le pilote lors de la première inscription de ce bloc, WMI ignore le traitement impliqué dans la mise à jour du bloc.

WMI n’envoie pas de requête IRP_MN_REGINFO_EX après qu’un pilote a appelé IoWMIRegistrationControl avec WMIREG_ACTION_DEREGISTER, car WMI ne nécessite aucune autre information du pilote. Un pilote désinscrit généralement ses blocs en réponse à une demande de IRP_MN_REMOVE_DEVICE .

Spécifications

En-tête

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

Voir aussi

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO