Verwenden von benutzerdefinierten WMI-Ereignissen
Einige Klassen von Treibern sind erforderlich, um bestimmte WMI-Ereignisklassen zu unterstützen. Treiber können auch eigene benutzerdefinierte WMI-Ereignisklassen entwerfen. Benutzerdefinierte WMI-Ereignisse bieten eine Möglichkeit für einen Treiber, Daten zurück an eine Benutzermoduskomponente zu übergeben. Eine Benutzermoduskomponente empfängt WMI-Ereignisse über WMI-COM-Schnittstellen.
Eine Anwendung kann Ereignisbenachrichtigungen wie folgt empfangen:
Verwenden Sie die CoCreateInstance-Routine , um einen Zeiger auf ein IWbemLocator-Objekt abzurufen.
Verwenden Sie den IWbemLocator-Zeiger , um eine Verbindung mit dem WMI-Serverprozess herzustellen. Der IWBemLocator::ConnectServer-Methodenaufruf stellt einen Zeiger auf ein IWbemServices-Objekt bereit.
Verwenden Sie das IWbemServices-Objekt , um die Ereignistypen abzufragen, an denen Sie interessiert sind. Mit der IWbemServices::ExecNotificationQuery-Methode können Sie eine Ereignisabfrage in der WMI-Abfragesprache (WQL) angeben.
Eine Anwendung kann sich auch registrieren, um WMI-Ereignisse asynchron zu empfangen, indem sie die IWbemObjectSink-Schnittstelle implementiert. Die Anwendung verwendet die IWbemServices::ExecNotificationQueryAsync-Methode , um sich für die asynchrone Ereignisbenachrichtigung zu registrieren. Wenn übereinstimmende Ereignisse auftreten, verwendet das System die IWbemObjectSink::Indicate-Methode , um die Anwendung über die aufgetretenen Ereignisse zu benachrichtigen.
Sie können auch einen WMI-Ereignisconsumeranbieter im Benutzermodus implementieren. Dies ist eine Benutzermoduskomponente, die WMI automatisch laden kann, wenn Ereignisse eines angegebenen Typs auftreten.
Fügen Sie eine instance der __EventConsumerProviderRegistration WMI-Klasse in die MOF-Daten für Ihre Benutzermoduskomponente ein.
Implementieren Sie die IWbemUnboundObjectSink-Schnittstelle für jede WMI-Ereignisklasse, von der Sie Benachrichtigungen erhalten möchten.
Implementieren Sie die IWbemEventConsumerProvider-Schnittstelle , um die Ereignisklassen anzugeben, von der die Komponente Benachrichtigungen empfängt, und die zugeordneten IWbemUnboundObjectSink-Implementierungen .
Implementieren Sie die IWbemProviderInit-Schnittstelle , die Ihre Komponente als Ereignisconsumer initialisiert.
Weitere Informationen zum Empfangen von WMI-Ereignissen und den IWbemXxx-COM-Schnittstellen finden Sie in der Microsoft Windows SDK-Dokumentation.
WMI-Ereignisse sind nicht die einzige Möglichkeit, Anwendungen im Benutzermodus zu benachrichtigen, wenn bestimmte Situationen auftreten. Ein Treiber könnte eine IOCTL implementieren, mit der eine Anwendung Benachrichtigungen abfragen kann. Der Treiber und die Anwendung können ein Benachrichtigungsereignisobjekt (siehe Ereignisobjekte) gemeinsam nutzen, um zu signalisieren, dass eine bestimmte Situation aufgetreten ist.
WMI-Ereignisse haben gegenüber diesen anderen Methoden einige Vorteile:
Wenn Benutzermodusanwendungen Ereignisse schneller abfragen, als der Treiber reagieren kann, sind für den Treiber möglicherweise viele IOCTLs ausstehend.
Sie können das vorherige Problem beheben, indem Sie ein Benachrichtigungsereignisobjekt verwenden, um eine Anwendung im Benutzermodus zu benachrichtigen, aber Benachrichtigungsereignisse können nur signalisieren, dass ein Ereignis aufgetreten ist. Die Anwendung muss weiterhin eine IOCTL verwenden, um zusätzliche Daten abzurufen. Die nächsten beiden Probleme gelten weiterhin.
Wenn mehrere Anwendungen den Treiber nach Ereignissen abfragen, muss der Treiber den Zustand beibehalten, um zu bestimmen, welche Anwendungen welche Ereignisse empfangen haben.
Einige Treiber, z. B. SCSI-Miniport- und NDIS-Miniporttreiber, können keine IOCTLs empfangen.
WMI-Ereignisse haben den Nachteil, dass der von Ihnen bereitgestellte Benutzermoduscode wesentlich komplizierter ist als bei den anderen Methoden.