WmiSystemControl-Funktion (wmilib.h)
Die WmiSystemControl Routine ist eine Verteilerroutine für Treiber, die WMI-Bibliotheksunterstützungsroutinen zum Verarbeiten von WMI-IRPs verwenden.
Syntax
NTSTATUS WmiSystemControl(
[in] PWMILIB_CONTEXT WmiLibInfo,
[in] PDEVICE_OBJECT DeviceObject,
[in, out] PIRP Irp,
[out] PSYSCTL_IRP_DISPOSITION IrpDisposition
);
Parameter
[in] WmiLibInfo
Ein Zeiger auf eine WMILIB_CONTEXT Struktur, die Registrierungsinformationen für die Datenblöcke und Ereignisblöcke eines Treibers enthält, und definiert Einstiegspunkte für die WMI-Bibliotheksrückrufroutinen des Treibers.
[in] DeviceObject
Ein Zeiger auf die DEVICE_OBJECTdes Treibers.
[in, out] Irp
Ein Zeiger auf das IRP-.
[out] IrpDisposition
Ein Zeiger auf einen Enumerationswert vom Typ SYSCTL_IRP_DISPOSITION, der angibt, wie das IRP verarbeitet wurde. WmiSystemControl diesen Wert immer festlegen, auch wenn er einen nicht erfolgreichen NTSTATUS-Code zurückgibt.
SYSCTL_IRP_DISPOSITION ist eine Aufzählung in Wmilib.h und enthält die folgenden Werte:
IrpProcessed
Das IRP wurde verarbeitet und möglicherweise abgeschlossen. Wenn die DpWmiXxx-Routine des Treibers, die von WmiSystemControl aufgerufen wird, das IRP nicht abgeschlossen hat, muss der Treiber WmiCompleteRequest- aufrufen, um das IRP abzuschließen, nachdem WmiSystemControl zurückgegeben wurde.
IrpNotCompleted
Das IRP wurde verarbeitet, aber nicht abgeschlossen, entweder weil WMI einen Fehler erkannt und das IRP mit einem entsprechenden Fehlercode eingerichtet hat, oder eine IRP_MN_REGINFO- oder IRP_MN_REGINFO_EX-Anforderung verarbeitet hat. Der Treiber muss das IRP abschließen, indem IoCompleteRequestaufgerufen wird.
IrpNotWmi
Das IRP ist keine WMI-Anforderung (d. h. WMI erkennt nicht den Nebencode des IRP). Wenn der Treiber IRP_MJ_SYSTEM_CONTROL Anforderungen mit diesem IRP_MN_XXX-verarbeitet, sollte er das IRP behandeln; andernfalls sollte der Treiber das IRP an den nächsten unteren Treiber weiterleiten. Wenn es sich bei dem Treiber um den Treiber der niedrigsten Ebene handelt, muss er das IRP abschließen.
IrpForward
Das IRP ist auf ein anderes Geräteobjekt ausgerichtet (d. h. der Geräteobjektzeiger bei Parameters.WMI.ProviderId im IRP stimmt nicht mit dem Zeiger überein, der vom Treiber in seinem Aufruf an IoWMIRegistrationControlübergeben wird). Der Treiber muss das IRP an den nächsten unteren Treiber weiterleiten. Wenn es sich bei dem Treiber um den Treiber der niedrigsten Ebene handelt, muss er das IRP abschließen.
Rückgabewert
WmiSystemControl gibt STATUS_SUCCESS oder eine der folgenden Fehlercodes zurück:
Bemerkungen
Wenn ein Treiber eine IRP_MJ_SYSTEM_CONTROL Anforderung mit einem WMI-IRP-Nebencode empfängt, ruft er WmiSystemControl mit einem Zeiger auf die WMILIB_CONTEXT Struktur des Treibers, einen Zeiger auf sein Geräteobjekt und einen Zeiger auf das IRP auf. Die WMILIB_CONTEXT-Struktur enthält Registrierungsinformationen für die Datenblöcke und Ereignisblöcke des Treibers und definiert Einstiegspunkte für die Rückrufroutinen der WMI-Bibliothek.
WmiSystemControl bestätigt, dass das IRP eine WMI-Anforderung ist und bestimmt, ob der durch die Anforderung angegebene Block für den Treiber gültig ist. Wenn ja, wird das IRP durch Aufrufen des entsprechenden DpWmiXxx-Einstiegspunkts in der WMILIB_CONTEXT Struktur des Treibers verarbeitet. WMI wird bei IRQL-PASSIVE_LEVEL ausgeführt, wenn er die DpWmiXxx-Routine des Treibers aufruft.
Ein Treiber muss bei IRQL-PASSIVE_LEVEL ausgeführt werden, wenn er eine IRP_MJ_SYSTEM_CONTROL Anforderung an den nächsten niedrigeren Treiber weiterleitet.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Verfügbar in Windows 2000 und höheren Versionen von Windows. |
Zielplattform- | Universal |
Header- | wmilib.h (einschließen Wmilib.h) |
Library | Wmilib.lib |
IRQL- | PASSIVE_LEVEL (siehe Abschnitt "Hinweise") |
DDI-Complianceregeln | WmiComplete(wdm) |