Freigeben über


WMI_EXECUTE_METHOD_CALLBACK Rückruffunktion (wmilib.h)

Die DpWmiExecuteMethod Routine führt eine Methode aus, die einem Datenblock zugeordnet ist. Diese Routine ist optional.

Syntax

WMI_EXECUTE_METHOD_CALLBACK WmiExecuteMethodCallback;

NTSTATUS WmiExecuteMethodCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG MethodId,
  [in]      ULONG InBufferSize,
  [in]      ULONG OutBufferSize,
  [in, out] PUCHAR Buffer
)
{...}

Parameter

[in] DeviceObject

Zeiger auf die WDM-DEVICE_OBJECT Struktur des Treibers.

[in] Irp

Zeiger auf das IRP.

[in] GuidIndex

Gibt den Datenblock an, indem ein nullbasierter Index in der Liste der GUIDs bereitgestellt wird, die der Treiber in der WMILIB_CONTEXT Struktur an WmiSystemControlübergeben hat.

[in] InstanceIndex

Wenn der durch GuidIndex- angegebene Block mehrere Instanzen aufweist, gibt InstanceIndex- einen nullbasierten Indexwert an, der die Instanz identifiziert.

[in] MethodId

Gibt die ID der auszuführenden Methode an. Der Treiber definiert die Methoden-ID als Element in einem Datenblock.

[in] InBufferSize

Gibt die Größe in Byte der Eingabedaten an. Wenn keine Eingabedaten vorhanden sind, ist InBufferSize null.

[in] OutBufferSize

Gibt die Anzahl der im Puffer für Ausgabedaten verfügbaren Bytes an.

[in, out] Buffer

Zeigen Sie auf einen Puffer, der ggf. Eingabedaten enthält, und empfängt ggf. Ausgabedaten für die Methode. Wenn der Puffer zu klein ist, um alle Ausgabedaten zu empfangen, gibt der Treiber STATUS_BUFFER_TOO_SMALL zurück und ruft WmiCompleteRequest- mit der erforderlichen Größe auf.

Rückgabewert

DpWmiExecuteMethod gibt STATUS_SUCCESS oder einen entsprechenden Fehlercode wie den folgenden zurück:

Bemerkungen

WMI ruft die DpWmiExecuteMethod Routine eines Treibers auf, nachdem der Treiber als Reaktion auf eine IRP_MN_EXECUTE_METHOD Anforderung WmiSystemControl aufruft.

Wenn ein Treiber eine DpWmiExecuteMethod- Routine implementiert, muss der Treiber die Adresse der Routine im ExecuteWmiMethod Member der WMILIB_CONTEXT Struktur platzieren, die an WmiSystemControlübergeben wird. Wenn ein Treiber keine DpWmiExecuteMethod- Routine implementiert, muss er ExecuteWmiMethod- auf NULL-festlegen. Im letzteren Fall gibt WMI STATUS_INVALID_DEVICE_REQUEST als Reaktion auf eine beliebige IRP_MN_EXECUTE_METHOD Anforderung an den Aufrufer zurück.

Der Treiber ist für die Überprüfung aller Eingabeargumente verantwortlich. Insbesondere muss der Treiber Folgendes ausführen:

  • Stellen Sie sicher, dass der GuidIndex- Wert zwischen Null und GuidCount-1 liegt, basierend auf dem GuidCount Member der WMILIB_CONTEXT Struktur.
  • Stellen Sie sicher, dass der Treiber den angegebenen Datenblock zum Entfernen nicht gekennzeichnet hat. Wenn der Treiber kürzlich das WMIREG_FLAG_REMOVE_GUID Flag in einer WMIGUIDREGINFO- Struktur angegeben hat, die in einer WMILIB_CONTEXT-Struktur enthalten ist, ist es möglich, dass eine zusätzliche Anforderung eintreffen kann, bevor die Entfernung erfolgt.
  • Stellen Sie sicher, dass sich der InstanceIndex- Wert im Bereich der Instanzindizes befindet, die vom Treiber für den Datenblock unterstützt werden.
  • Stellen Sie sicher, dass der von MethodId bereitgestellte Methodenbezeichner ein gültiger Bezeichner für den angegebenen Datenblock ist und dass der Aufrufer die Methode ausführen darf.
  • Stellen Sie sicher, dass Puffer und InBufferSize einen Puffer beschreiben, der groß genug ist, um die Eingabeparameter der angegebenen Methode zu enthalten, einschließlich des Abstands bei Bedarf, und stellen Sie sicher, dass die Eingabeparameter gültig sind.
  • Stellen Sie sicher, dass Buffer und OutBufferSize einen Puffer beschreiben, der groß genug ist, um die Ausgabedaten der angegebenen Methode zu empfangen, einschließlich des Abstands, falls erforderlich.
Gehen Sie nicht davon aus, dass der Threadkontext der initiierenden Anwendung für den Benutzermodus ist– ein Treiber auf höherer Ebene hat ihn möglicherweise geändert.

Wenn die angegebene Methode einen Vorgang ausführt, der Datenverlust verursacht, z. B. das Abrufen und Zurücksetzen des Inhalts einer Reihe von Leistungsindikatoren, sollte der Treiber die Ausgabepuffergröße überprüfen, bevor der Vorgang ausgeführt wird. Auf diese Weise kann der Treiber STATUS_BUFFER_TOO_SMALL zurückgeben und dem Aufrufer erlauben, die Anforderung erneut mit einem größeren Puffer zu übermitteln, ohne die Zähler vorzeitig zurückzusetzen.

Nachdem Sie die Methode ausgeführt und alle Ausgabedaten in den Puffer geschrieben haben, ruft der Treiber WmiCompleteRequest- auf, um die Anforderung abzuschließen.

Diese Routine kann seitenfähig sein.

Weitere Informationen zum Implementieren dieser Routine finden Sie unter Aufrufen von WmiSystemControl zum Behandeln von WMI IRPs.

Anforderungen

Anforderung Wert
Zielplattform- Desktop
Header- wmilib.h (einschließen Wmilib.h)
IRQL- Wird bei PASSIVE_LEVEL aufgerufen.

Siehe auch

IRP_MN_EXECUTE_METHOD

WMILIB_CONTEXT

WmiCompleteRequest-

WmiSystemControl-