Envoi d’un événement avec WmiFireEvent

Un pilote peut appeler WmiFireEvent pour envoyer des événements qui n’utilisent pas de noms de instance dynamiques et qui basent des noms de instance statiques sur une seule chaîne de nom de base ou sur l’ID de instance d’appareil d’un PDO.

L’événement doit être un seul instance d’un bloc, c’est-à-dire qu’un pilote ne peut pas appeler WmiFireEvent pour envoyer un événement qui se compose d’un seul élément ou de plusieurs instances. Pour envoyer de tels événements, un pilote doit appeler IoWMIWriteEvent, comme décrit dans Envoi d’un événement avec IoWMIWriteEvent.

Un pilote ne doit pas envoyer d’événements tant que WMI n’a pas activé l’événement. Une fois l’événement activé, lorsque la condition de déclencheur de l’événement se produit, le pilote :

  1. Alloue une mémoire tampon à partir du pool non paginé et écrit les données d’événement dans la mémoire tampon. Si l’événement ne contient pas de données, le pilote peut ignorer cette étape.

  2. Appelle WmiFireEvent avec les paramètres suivants :

    • Pointeur vers l’objet de périphérique du pilote

    • Pointeur vers le GUID qui représente le bloc d’événements

    • Si le bloc d’événements a plusieurs instances, l’index du instance

    • Si des données doivent être envoyées avec l’événement, le nombre d’octets de données, ou 0 si aucun

    • Si des données doivent être envoyées avec l’événement, pointeur vers la mémoire tampon allouée par le pilote qui contient les données, ou NULL si aucune

    Le pilote doit allouer tous les paramètres passés à WmiFireEvent, y compris la mémoire tampon de données d’événement, à partir d’un pool non paginé. WMI libère la mémoire allouée au pilote sans intervention supplémentaire du pilote.

Une fois WmiFireEvent retourné, le pilote reprend la surveillance de la condition de déclencheur de l’événement et envoie l’événement chaque fois que sa condition de déclencheur se produit jusqu’à ce que WMI désactive cet événement.