Senden von WMI-Ereignissen

Ein Treiber kann WMI-Ereignisse verwenden, um Benutzermodusanwendungen über Ereignisse zu benachrichtigen, ohne dass die Anwendungen IRPs abfragen oder senden müssen. Ein Treiber sollte WMI-Ereignisse verwenden, um WMI-Clients über außergewöhnliche Bedingungen zu benachrichtigen, nicht als Alternative zur Fehlerprotokollierung. Ein Treiber sollte alle Standardereignisblöcke unterstützen, die für seinen Gerätetyp in Wmicore.mof definiert sind, und kann zusätzliche benutzerdefinierte Ereignisblöcke definieren und registrieren, um gerätespezifische Benachrichtigungen zu unterstützen.

Ein Ereignisblock ist einfach ein Datenblock, der von der abstrakten Basisklasse WMIEvent abgeleitet ist. Ein Ereignisblock kann dieselben Daten wie ein Datenblock enthalten oder leer sein, d. h. ein Ereignisblock muss keine vom Treiber definierten Datenelemente enthalten. Wenn ein Ereignisblock Daten enthält, sollte die Gesamtgröße des WNODE_XXX plus der Daten den von der Registrierung definierten Grenzwert von 1 Kb nicht überschreiten. Im Allgemeinen führen kleinere Ereignisse zu einer besseren Systemleistung und einer schnelleren Benachrichtigung. Informationen zum Definieren von Blöcken finden Sie unter MOF-Syntax für WMI-Daten- und Ereignisblöcke und Entwerfen von WMI-Daten und -Ereignisblöcken.

Ein Treiber gibt die Unterstützung für ein Ereignis an, indem er den entsprechenden Ereignisblock bei WMIREG_FLAG_EVENT_ONLY_GUID in der WMIREGGUID-Struktur des Blocks registriert. Informationen zum Registrieren von Blöcken finden Sie unter Registrieren als WMI-Datenanbieter.

Wenn ein WMI-Clientbenutzer eine Benachrichtigung über ein Ereignis anfordert, sendet WMI eine IRP_MN_ENABLE_EVENTS Anforderung an den Treiber, die den Treiber benachrichtigt, um mit der Überwachung der treiberbestimmten Triggerbedingung des Ereignisses zu beginnen. Wenn dann die Triggerbedingung auftritt, sendet der Treiber das Ereignis an WMI, das es an alle Datenverbraucher übermittelt, die sich für das Ereignis registriert haben.

Ein Treiber sendet ein Ereignis auf eine der folgenden Arten an WMI:

  • Rufen Sie die Kernelmodus-WMI-Bibliotheksroutine WmiFireEvent auf. Ein Treiber kann WmiFireEvent aufrufen, um nur Ereignisse zu senden, die keine dynamischen instance-Namen verwenden, und die statischen instance Namen auf einer einzelnen Basisnamenzeichenfolge oder dem Gerät instance ID eines PDO basieren. Darüber hinaus muss das Ereignis ein einzelner instance sein. Das heißt, ein Treiber kann WmiFireEvent nicht aufrufen, um ein Ereignis zu senden, das aus einem einzelnen Element oder mehreren Instanzen besteht. Weitere Informationen finden Sie unter Senden eines Ereignisses mit WmiFireEvent.

  • Rufen Sie die Kernelmodusroutine IoWMIWriteEvent mit einem Zeiger auf eine vom Treiber zugewiesene und initialisierte WNODE_XXX-Struktur auf, die die Ereignisdaten enthält. Weitere Informationen finden Sie unter Senden eines Ereignisses mit IoWMIWriteEvent.