Aufrufen von WmiSystemControl zum Verarbeiten von WMI-IRPs
WMI-Bibliotheksroutinen vereinfachen die Verarbeitung von WMI-Anforderungen, da ein Treiber WmiSystemControl aufruft, anstatt jede solche Anforderung zu verarbeiten. Im WmiSystemControl-Aufruf übergibt der Treiber eine initialisierte WMILIB_CONTEXT-Struktur , die Einstiegspunkte zu den WMI-Bibliotheksrückrufroutinen des Treibers (DpWmiXxx-Routinen ) sowie Informationen zu den Datenblöcken und Ereignisblöcken des Treibers enthält.
Da die WMI-Bibliothek keinen Mechanismus zum Übergeben von dynamischen instance-Namen oder einer statischen instance Namensliste bietet, kann ein Treiber die WMI-Bibliothek verwenden, um Anforderungen zu verarbeiten, die nur Datenblöcke mit statischen instance Namen basierend auf einer PDO oder einer einzelnen Basisnamenzeichenfolge enthalten. Weitere Informationen zu statischen und dynamischen instance Namen finden Sie unter Definieren von WMI-Instanznamen. Nichts hindert einen Treiber daran, die WMI-Bibliothek zum Verarbeiten von Anforderungen für solche Blöcke und die Verarbeitung von Anforderungen für andere Blöcke in seiner DispatchSystemControl-Routine zu verwenden. Weitere Informationen finden Sie unter Verarbeiten von WMI-IRPs in einer DispatchSystemControl-Routine.
Um WMI IRPs durch Aufrufen von WmiSystemControl zu verarbeiten, muss ein Treiber bestimmte erforderliche DpWmiXxx-Rückrufroutinen implementieren und möglicherweise zusätzliche optionale DpWmiXxx-Rückrufroutinen implementieren:
DpWmiQueryReginfo– (Erforderlich) Stellt Informationen zu den Daten und Ereignisblöcken bereit, die vom Treiber registriert werden. WMI ruft die DpWmiQueryReginfo-Routine eines Treibers auf, um eine IRP_MN_REGINFO- oder IRP_MN_REGINFO_EX-Anforderung zu verarbeiten. Weitere Informationen finden Sie unter Verwenden der WMI-Bibliothek zum Registrieren von Blöcken.
DpWmiQueryDataBlock– (Erforderlich) Gibt entweder eine einzelne instance oder alle Instanzen eines Datenblocks zurück. WMI ruft die DpWmiQueryDataBlock-Routine eines Treibers auf, um eine IRP_MN_QUERY_SINGLE_INSTANCE- oder IRP_MN_QUERY_ALL_DATA-Anforderung zu verarbeiten.
DpWmiSetDataBlock– (Optional) Ändert alle Datenelemente in einer einzelnen instance eines Datenblocks. WMI ruft die DpWmiSetDataBlock-Routine eines Treibers auf, um eine IRP_MN_CHANGE_SINGLE_INSTANCE Anforderung zu verarbeiten.
DpWmiSetDataItem– (Optional) Ändert ein einzelnes Datenelement in einer instance eines Datenblocks. WMI ruft die DpWmiSetDataItem-Routine eines Treibers auf, um eine IRP_MN_CHANGE_SINGLE_ITEM-Anforderung zu verarbeiten.
DpWmiFunctionControl – (Optional) Aktiviert und deaktiviert Ereignisbenachrichtigungen und Datensammlungen für Blöcke, die als teuer zu erfassen registriert sind. WMI ruft die DpWmiFunctionControl-Routine eines Treibers auf, um eine IRP_MN_ENABLE_COLLECTION-, IRP_MN_DISABLE_COLLECTION-, IRP_MN_ENABLE_EVENTS- oder IRP_MN_DISABLE_EVENTS-Anforderung zu verarbeiten.
DpWmiExecuteMethod– (Optional) Führt eine Methode aus, die einem Datenblock zugeordnet ist. WMI ruft die DpWmiExecuteMethod-Routine eines Treibers auf, um eine IRP_MN_EXECUTE_METHOD-Anforderung zu verarbeiten.
Für DpWmiXxx-Routinen eines Treibers können alle Namen vom Treiberschreiber ausgewählt werden.
Vor dem Aufrufen von WmiSystemControl muss der Treiber eine WMILIB_CONTEXT-Struktur mit Einstiegspunkten zu seinen DpWmiXxx-Routinen und Informationen zu seinen Datenblöcken und Ereignisblöcken initialisieren.
Wenn der Treiber eine WMI-Anforderung empfängt:
Der Treiber ruft WmiSystemControl mit einem Zeiger auf die initialisierte WMILIB_CONTEXT-Struktur , einem Zeiger auf sein Geräteobjekt und einem Zeiger auf das IRP auf.
WMI überprüft die IRP-Parameter und ruft die DpWmiXxx-Routine des Treibers auf, die die Anforderung verarbeitet. Wenn der Treiber keinen Einstiegspunkt in seinem WMILIB_CONTEXT für eine optionale DpWmiXxx-Routine festgelegt hat, schließt WMI den IRP mit Standardwerten und status ab.
In seiner DpWmiXxx-Routine verarbeitet der Treiber die Anforderung und schreibt jede Ausgabe in den vom Aufrufer bereitgestellten Puffer. Beispielsweise schreibt die DpWmiQueryDataBlock-Routine eines Treibers die angeforderten instance des angegebenen Blocks in den Puffer.
In allen DpWmiXxx-Routinen mit Ausnahme von DpWmiQueryReginfo ruft der Treiber WmiCompleteRequest auf, um die Anforderung abzuschließen, oder gibt STATUS_PENDING zurück, um die Fertigstellung zu verschieben, wie bei jedem IRP.
WMI führt alle erforderlichen Nachbearbeitungen durch, verpackt alle Ausgaben in einer entsprechenden WNODE_XXX-Struktur und übergibt die Ausgabe und status an den Daten consumer.