Partager via


Prise en charge des blocs de données et des événements WMI dans votre pilote

[S’applique uniquement à KMDF]

Les pilotes basés sur l’infrastructure prennent en charge les blocs de données WMI en fournissant des fonctions de rappel d’événements. Les pilotes prennent en charge les événements WMI en appelant une méthode objet qui envoie un événement aux clients WMI.

Prise en charge des blocs de données WMI en lecture-écriture

Si les informations d’un bloc de données WMI sont à la fois lisibles et accessibles en écriture par les clients WMI, le pilote doit fournir une fonction de rappel EvtWmiInstanceQueryInstance qui traite les demandes de lecture d’un client, ainsi que des fonctions de rappel EvtWmiInstanceSetItem (ou les deux) qui traitent les demandes d’écriture d’un client.

Si le bloc de données contient des méthodes que le pilote exécute à la demande du client, le pilote doit également fournir une fonction de rappel EvtWmiInstanceExecuteMethod .

Si un bloc de données WMI est en écriture seule (autrement dit, les clients WMI peuvent écrire des informations dans le bloc de données, mais ne peuvent pas lire le bloc de données), le pilote ne fournit pas de fonction de rappel EvtWmiInstanceQueryInstance .

Prise en charge des blocs de données WMI Read-Only

Si les informations d’un bloc de données WMI ne peuvent pas être modifiées par un client WMI, le pilote ne fournit pas de fonctions de rappel EvtWmiInstanceSetInstance ou EvtWmiInstanceSetItem . Pour prendre en charge les demandes d’informations du bloc de données provenant de clients WMI, le pilote peut effectuer l’une des opérations suivantes :

Si le pilote définit UseContextForQuery sur TRUE, l’infrastructure copie l’espace de contexte de l’objet instance dans une mémoire tampon fournie par WMI lorsqu’un client WMI demande les informations du instance. Aucun rappel EvtWmiInstanceXxx n’est requis si le pilote n’a qu’une seule instance WMI qui fournit des données de longueur fixe en lecture seule à partir de sa zone de contexte d’objet.

Si un bloc de données en lecture seule contient des méthodes que le pilote exécute à la demande du client, le pilote peut également fournir une fonction de rappel EvtWmiInstanceExecuteMethod .

Prise en charge des blocs de données WMI coûteux

Si votre pilote collecte des quantités relativement importantes de données dynamiques pour prendre en charge l’un de ses blocs de données WMI, il doit effectuer les opérations suivantes :

  • Déclarez le bloc de données comme étant « coûteux » en définissant l’indicateur WdfWmiProviderExpensive dans le membre Flags de la structure WDF_WMI_PROVIDER_CONFIG de l’objet du fournisseur WMI.

  • Fournissez une fonction de rappel EvtWmiProviderFunctionControl qui active et désactive la collecte de données pour le bloc de données, ou appelez WdfWmiProviderIsEnabled pour déterminer si le pilote doit activer ou désactiver la collecte de données.

Si votre pilote définit l’indicateur WdfWmiProviderExpensive , l’infrastructure appelle la fonction de rappel EvtWmiProviderFunctionControl lorsqu’un client WMI s’inscrit pour accéder au bloc de données. La fonction de rappel doit permettre au pilote de collecter des données. Si tous les clients WMI suppriment leurs inscriptions pour le bloc de données, l’infrastructure appelle à nouveau la fonction de rappel EvtWmiProviderFunctionControl afin que le pilote puisse arrêter la collecte de données.

Prise en charge des événements WMI

Un pilote peut utiliser des événements WMI pour informer les clients WMI de conditions exceptionnelles. (Vous ne devez pas utiliser les événements WMI comme alternative aux erreurs de journalisation.) Comme les éléments de données, les événements WMI sont définis dans des blocs de données WMI dans des fichiers au format objet managé (.mof).

Les clients WMI s’inscrivent pour la notification des événements WMI. Pour envoyer un événement aux clients WMI inscrits, votre pilote appelle la méthode WdfWmiInstanceFireEvent . Cette méthode permet au pilote d’envoyer éventuellement des données spécifiques à un événement aux clients.

Si le bloc de données WMI qui définit l’événement contient également des éléments de données WMI ou des éléments de méthode, le pilote fournit des fonctions de rappel WMI appropriées. Si un bloc de données définit un événement mais ne contient pas de données ou d’éléments de méthode, votre pilote doit définir l’indicateur WdfWmiProviderEventOnly dans le membre Flags de la structure WDF_WMI_PROVIDER_CONFIG de l’objet du fournisseur WMI.

Le pilote doit appeler WdfWmiInstanceFireEvent uniquement si un client WMI s’est inscrit pour la notification d’événement. Le pilote peut déterminer s’il doit appeler WdfWmiInstanceFireEvent en fournissant une fonction de rappel EvtWmiProviderFunctionControl ou en appelant WdfWmiProviderIsEnabled.

Prise en charge du suivi d’événements WMI

Les événements de trace sont définis dans les fichiers .mof, de la même manière que les autres événements WMI. Lorsque votre pilote crée un objet de fournisseur WMI pour un événement de trace, il doit définir l’indicateur WdfWmiProviderTracing dans le membre Flags de la structure WDF_WMI_PROVIDER_CONFIG de l’objet fournisseur.

Une fois qu’un fournisseur instance a été inscrit, le pilote peut appeler WdfWmiProviderGetTracingHandle pour obtenir un handle de suivi. Le pilote peut utiliser le handle de suivi comme entrée dans la routine WmiTraceMessage .

Pour plus d’informations sur le suivi des événements, consultez :