Share via


Senden eines Ereignisses mit IoWMIWriteEvent

Ein Treiber kann IoWMIWriteEvent aufrufen, um ein beliebiges Ereignis zu senden. Das Ereignis kann aus einem einzelnen Element, einem einzelnen instance oder allen Instanzen eines Datenblocks bestehen und dynamische instance Namen verwenden.

Im Gegensatz zu WNODE_XXX-Strukturen , die mit Abfrage- oder Änderungsanforderungen übergeben werden, die von WMI zugeordnet und teilweise initialisiert werden, muss der Treiber alle Member der WNODE_XXX-Struktur zuordnen und initialisieren, die ein Ereignis enthält.

Ein Treiber muss ein Ereignis erst senden, nachdem WMI eine IRP_MN_ENABLE_EVENTS Anforderung zum Aktivieren des Ereignisses gesendet hat. Wenn dann die Triggerbedingung des Ereignisses auftritt, führt der Treiber Folgendes aus:

  1. Weist einen Puffer aus einem nicht ausgestellten Pool zu, um die für das Ereignis erforderliche WNODE_XXX-Struktur zu enthalten, einschließlich Speicherplatz für Variablendaten( falls vorhanden).

    Je nach Ereignis weist der Treiber dem Ereignis möglicherweise eine WNODE_SINGLE_ITEM, eine WNODE_SINGLE_INSTANCE oder eine WNODE_ALL_DATA zu. Die Größe der WNODE_XXX plus-Variablendaten darf den von der Registrierung definierten Grenzwert von 1K nicht überschreiten.

  2. Initialisiert alle Member der WNODE_XXX-Struktur , einschließlich WnodeHeader.Flags:

    • Der Treiber legt das WNODE_FLAG_EVENT_ITEM-Flag fest, um anzugeben, dass es sich bei der Struktur um ein Ereignis handelt.

    • Der Treiber legt eines der folgenden Flags fest, um den Typ der WNODE_XXX-Struktur anzugeben:

      WNODE_FLAG_ALL_DATA

      WNODE_FLAG_SINGLE_INSTANCE

      WNODE_FLAG_SINGLE_ITEM

    • Der Treiber legt die folgenden Flags fest oder löscht sie, um anzugeben, ob der Block statische oder dynamische instance Namen verwendet:

      WNODE_FLAG_STATIC_INSTANCE_NAMES

      WNODE_FLAG_PDO_INSTANCE_NAMES

    • Je nach Ereignis legt der Treiber möglicherweise zusätzliche Flags fest.

  3. Wandelt einen Zeiger auf den WNODE_XXX in eine PWNODE_EVENT_ITEM um.

  4. Ruft IoWMIWriteEvent mit dem Zeiger auf.

    Wenn IoWMIWriteEvent erfolgreich abgeschlossen wurde, gibt WMI den vom Treiber zugewiesenen Arbeitsspeicher für das Ereignis frei.

Nachdem IoWMIWriteEvent zurückgegeben wurde, setzt der Treiber die Überwachung der Triggerbedingung des Ereignisses fort und sendet das Ereignis jedes Mal, wenn die Triggerbedingung auftritt, bis WMI eine IRP_MN_DISABLE_EVENTS Anforderung zum Deaktivieren dieses Ereignisses sendet.

Wenn die Größe eines Ereignisses das von der Registrierung definierte Maximum von 1K überschreitet (nicht empfohlen), sollte der Treiber IoWmiWriteEvent mit einem initialisierten WNODE_EVENT_REFERENCE aufrufen, der die GUID des Ereignisses, seine Größe und seinen instance Index (für statische instance Namen) oder Namen (für dynamische instance-Namen) angibt. WMI verwendet die Informationen in der WNODE_EVENT_REFERENCE , um das Ereignis abzufragen.

Ein Treiber kann Ereignisse senden, die keine dynamischen instance Namen verwenden und aus einer einzelnen instance bestehen, indem die WMI-Bibliotheksroutine WmiFireEvent aufgerufen wird. Der Treiber muss keine WNODE_XXX-Struktur für einen WmiFireEvent-Aufruf zuordnen und initialisieren. WMI packt die Ereignisdaten des Treibers in einem WNODE_SINGLE_INSTANCE und übermittelt sie an Datenverbraucher. Weitere Informationen zum Senden von Ereignissen mit WmiFireEvent finden Sie unter Senden eines Ereignisses mit WmiFireEvent.