Partager via


Envoi d’un événement avec IoWMIWriteEvent

Un pilote peut appeler IoWMIWriteEvent pour envoyer n’importe quel événement. L’événement peut se composer d’un seul élément, d’un seul instance ou de toutes les instances d’un bloc de données, et il peut utiliser des noms de instance dynamiques.

Contrairement aux structures WNODE_XXX transmises avec des requêtes de requête ou de modification, qui sont allouées et partiellement initialisées par WMI, le pilote doit allouer et initialiser tous les membres de la structure WNODE_XXX qui contient un événement.

Un pilote doit envoyer un événement uniquement une fois que WMI a envoyé une demande de IRP_MN_ENABLE_EVENTS pour activer l’événement. Ensuite, lorsque la condition de déclencheur de l’événement se produit, le pilote :

  1. Alloue une mémoire tampon à partir d’un pool non paginé pour contenir la structure WNODE_XXX nécessaire à l’événement, y compris l’espace pour les données variables, le cas échéant.

    Selon l’événement, le pilote peut allouer un WNODE_SINGLE_ITEM, un WNODE_SINGLE_INSTANCE ou un WNODE_ALL_DATA pour l’événement. La taille des données variables WNODE_XXX plus ne doit pas dépasser la limite définie par le Registre de 1 000.

  2. Initialise tous les membres de la structure WNODE_XXX , y compris WnodeHeader.Flags :

    • Le pilote définit l’indicateur WNODE_FLAG_EVENT_ITEM pour indiquer que la structure est un événement.

    • Le pilote définit l’un des indicateurs suivants pour indiquer le type de structure WNODE_XXX :

      WNODE_FLAG_ALL_DATA

      WNODE_FLAG_SINGLE_INSTANCE

      WNODE_FLAG_SINGLE_ITEM

    • Le pilote définit ou efface les indicateurs suivants pour indiquer si le bloc utilise des noms de instance statiques ou dynamiques :

      WNODE_FLAG_STATIC_INSTANCE_NAMES

      WNODE_FLAG_PDO_INSTANCE_NAMES

    • Le pilote peut définir des indicateurs supplémentaires en fonction de l’événement.

  3. Convertit un pointeur vers le WNODE_XXX en PWNODE_EVENT_ITEM.

  4. Appelle IoWMIWriteEvent avec le pointeur.

    Si IoWMIWriteEvent se termine correctement, WMI libère la mémoire allouée au pilote pour l’événement.

Une fois ioWMIWriteEvent retourné, le pilote reprend la surveillance de la condition de déclencheur de l’événement et l’envoi de l’événement chaque fois que sa condition de déclencheur se produit, jusqu’à ce que WMI envoie une demande IRP_MN_DISABLE_EVENTS pour désactiver cet événement.

Si la taille d’un événement dépasse la taille maximale définie par le Registre de 1 Ko (non recommandé), le pilote doit appeler IoWmiWriteEvent avec un WNODE_EVENT_REFERENCE initialisé qui spécifie le GUID de l’événement, sa taille et son index instance (pour les noms de instance statiques) ou son nom (pour les noms de instance dynamiques). WMI utilise les informations du WNODE_EVENT_REFERENCE pour interroger l’événement.

Un pilote peut envoyer un événement qui n’utilise pas de noms de instance dynamiques et qui se compose d’un seul instance en appelant la routine de la bibliothèque WMI WmiFireEvent. Le pilote n’a pas besoin d’allouer et d’initialiser une structure WNODE_XXX pour un appel WmiFireEvent . WMI package les données d’événements du pilote dans un WNODE_SINGLE_INSTANCE et les livre aux consommateurs de données. Pour plus d’informations sur l’envoi d’événements avec WmiFireEvent, consultez Envoi d’un événement avec WmiFireEvent.