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:

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.