Appel de WmiSystemControl pour gérer les irps WMI
Les routines de bibliothèque WMI simplifient la gestion des requêtes WMI, car au lieu de traiter chacune de ces requêtes, un pilote appelle WmiSystemControl. Dans l’appel WmiSystemControl , le pilote transmet une structure WMILIB_CONTEXT initialisée qui contient des points d’entrée aux routines de rappel de la bibliothèque WMI du pilote (routines DpWmiXxx ) et des informations sur les blocs de données et les blocs d’événements du pilote.
Étant donné que la bibliothèque WMI ne fournit aucun mécanisme pour transmettre des noms de instance dynamiques ou une liste de noms de instance statique, un pilote peut utiliser la bibliothèque WMI pour gérer les demandes impliquant uniquement des blocs de données avec des noms de instance statiques basés sur une chaîne de nom de base ou une seule chaîne de nom de base. Pour plus d’informations sur les noms de instance statiques et dynamiques, consultez Définition de noms d’instance WMI. Rien n’empêche un pilote d’utiliser la bibliothèque WMI pour gérer les demandes de ces blocs et de traiter les demandes pour d’autres blocs dans sa routine DispatchSystemControl . Pour plus d’informations, consultez Traitement des irps WMI dans une routine DispatchSystemControl.
Pour gérer les irps WMI en appelant WmiSystemControl, un pilote doit implémenter certaines routines de rappel DpWmiXxx requises et peut implémenter des routines de rappel DpWmiXxx supplémentaires facultatives :
DpWmiQueryReginfo:(Obligatoire) Fournit des informations sur les données et les blocs d’événements inscrits par le pilote. WMI appelle la routine DpWmiQueryReginfo d’un pilote pour traiter une demande IRP_MN_REGINFO ou IRP_MN_REGINFO_EX . Pour plus d’informations, consultez Utilisation de la bibliothèque WMI pour inscrire des blocs.
DpWmiQueryDataBlock:(Obligatoire) Retourne une seule instance ou toutes les instances d’un bloc de données. WMI appelle la routine DpWmiQueryDataBlock d’un pilote pour traiter une requête IRP_MN_QUERY_SINGLE_INSTANCE ou IRP_MN_QUERY_ALL_DATA .
DpWmiSetDataBlock:(Facultatif) Modifie tous les éléments de données d’un seul instance d’un bloc de données. WMI appelle la routine DpWmiSetDataBlock d’un pilote pour traiter une demande de IRP_MN_CHANGE_SINGLE_INSTANCE .
DpWmiSetDataItem:(Facultatif) Modifie un seul élément de données dans un instance d’un bloc de données. WMI appelle la routine DpWmiSetDataItem d’un pilote pour traiter une demande de IRP_MN_CHANGE_SINGLE_ITEM .
DpWmiFunctionControl : (Facultatif) Active et désactive la notification d’événement et la collecte de données pour les blocs inscrits comme coûteux à collecter. WMI appelle la routine DpWmiFunctionControl d’un pilote pour traiter une requête IRP_MN_ENABLE_COLLECTION, IRP_MN_DISABLE_COLLECTION, IRP_MN_ENABLE_EVENTS ou IRP_MN_DISABLE_EVENTS .
DpWmiExecuteMethod—(Facultatif) Exécute une méthode associée à un bloc de données. WMI appelle la routine DpWmiExecuteMethod d’un pilote pour traiter une demande de IRP_MN_EXECUTE_METHOD .
Les routines DpWmiXxx d’un pilote peuvent avoir n’importe quel nom choisi par l’enregistreur de pilotes.
Avant d’appeler WmiSystemControl, le pilote doit initialiser une structure WMILIB_CONTEXT avec des points d’entrée vers ses routines DpWmiXxx et des informations sur ses blocs de données et les blocs d’événements.
Lorsque le pilote reçoit une requête WMI :
Le pilote appelle WmiSystemControl avec un pointeur vers sa structure WMILIB_CONTEXT initialisée, un pointeur vers son objet de périphérique et un pointeur vers l’IRP.
WMI valide les paramètres IRP et appelle la routine DpWmiXxx du pilote qui traite la requête. Si le pilote ne définit aucun point d’entrée dans son WMILIB_CONTEXT pour une routine DpWmiXxx facultative, WMI termine l’IRP avec les valeurs par défaut et status.
Dans sa routine DpWmiXxx , le pilote traite la requête et écrit toute sortie dans la mémoire tampon fournie par l’appelant. Par exemple, la routine DpWmiQueryDataBlock d’un pilote écrit la ou les instance demandées du bloc spécifié dans la mémoire tampon.
Dans toutes les routines DpWmiXxx à l’exception de DpWmiQueryReginfo, le pilote appelle WmiCompleteRequest pour terminer la demande, ou retourne STATUS_PENDING pour reporter l’achèvement, comme pour n’importe quel IRP.
WMI effectue tout post-traitement nécessaire, empaquette toute sortie dans une structure WNODE_XXX appropriée et transmet la sortie et la status au consommateur de données.