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 :

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 :

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.