Envoi d’événements WMI

Un pilote peut utiliser des événements WMI pour notifier les applications en mode utilisateur d’événements sans exiger que les applications interrogent ou envoient des IRPs. Un pilote doit utiliser des événements WMI pour informer les clients WMI de conditions exceptionnelles, et non comme alternative à la journalisation des erreurs. Un pilote doit prendre en charge tous les blocs d’événements standard définis pour son type d’appareil dans Wmicore.mof, et peut définir et inscrire des blocs d’événements personnalisés supplémentaires pour prendre en charge des notifications spécifiques à l’appareil.

Un bloc d’événements est simplement un bloc de données qui dérive de la classe de base abstraite WMIEvent. Un bloc d’événements peut contenir l’une des mêmes données qu’un bloc de données, ou il peut être vide, autrement dit, un bloc d’événements n’a pas besoin de contenir d’éléments de données définis par le pilote. Si un bloc d’événements contient des données, la taille totale du WNODE_XXX plus les données ne doit pas dépasser la limite définie par le Registre de 1 kilo-octet. En général, les événements plus petits entraînent de meilleures performances du système et une notification plus rapide. Pour plus d’informations sur la définition de blocs, consultez Syntaxe MOF pour les blocs de données et d’événements WMI etConception de blocs de données et d’événements WMI.

Un pilote indique la prise en charge d’un événement en inscrivant le bloc d’événements correspondant avec WMIREG_FLAG_EVENT_ONLY_GUID défini dans la structure WMIREGGUID du bloc. Pour plus d’informations sur l’inscription de blocs, consultez Inscription en tant que fournisseur de données WMI.

Lorsqu’un utilisateur client WMI demande la notification d’un événement, WMI envoie une demande de IRP_MN_ENABLE_EVENTS au pilote, qui avertit le pilote de commencer à surveiller la condition du déclencheur déterminé par le pilote de l’événement. Ensuite, lorsque la condition de déclencheur se produit, le pilote envoie l’événement à WMI, qui le remet à tous les consommateurs de données qui se sont inscrits pour l’événement.

Un pilote envoie un événement à WMI de l’une des manières suivantes :

  • Appelez la routine de bibliothèque WMI en mode noyau WmiFireEvent. Un pilote peut appeler WmiFireEvent pour envoyer uniquement des événements qui n’utilisent pas de noms de instance dynamiques et qui basent des noms de instance statiques sur une chaîne de nom de base unique ou l’ID de instance d’appareil d’un PDO. En outre, l’événement doit être un seul instance, 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 plus d’informations, consultez Envoi d’un événement avec WmiFireEvent.

  • Appelez la routine en mode noyau IoWMIWriteEvent avec un pointeur vers une structure WNODE_XXX allouée au pilote et initialisée qui contient les données de l’événement. Pour plus d’informations, consultez Envoi d’un événement avec IoWMIWriteEvent.