WMI_SET_DATABLOCK_CALLBACK Rückruffunktion (wmilib.h)

Die DpWmiSetDataBlock-Routine ändert alle Datenelemente in einer einzelnen instance eines Datenblocks. Diese Routine ist optional.

Syntax

WMI_SET_DATABLOCK_CALLBACK WmiSetDatablockCallback;

NTSTATUS WmiSetDatablockCallback(
  [in] PDEVICE_OBJECT DeviceObject,
  [in] PIRP Irp,
  [in] ULONG GuidIndex,
  [in] ULONG InstanceIndex,
  [in] ULONG BufferSize,
  [in] PUCHAR Buffer
)
{...}

Parameter

[in] DeviceObject

Zeiger auf die WDM-DEVICE_OBJECT-Struktur des Treibers.

[in] Irp

Zeiger auf den IRP.

[in] GuidIndex

Gibt den Datenblock durch seinen nullbasierten Index in der Liste der GUIDs an, die vom Treiber in der WMILIB_CONTEXT Struktur bereitgestellt werden, die er an WmiSystemControl übergeben hat.

[in] InstanceIndex

Wenn der durch GuidIndex angegebene Block über mehrere Instanzen verfügt, gibt InstanceIndex die instance an.

[in] BufferSize

Gibt die Größe des Puffers in Bytes bei Buffer an.

[in] Buffer

Zeiger auf einen Puffer, der neue Werte für die instance enthält.

Rückgabewert

DpWmiSetDataBlock gibt STATUS_SUCCESS oder einen entsprechenden Fehler status wie den folgenden zurück:

Wenn der Treiber die Anforderung nicht sofort abschließen kann, kann er STATUS_PENDING zurückgeben.

Hinweise

WMI ruft die DpWmiSetDataBlock-Routine eines Treibers auf, nachdem der Treiber WmiSystemControl als Antwort auf eine IRP_MN_CHANGE_SINGLE_INSTANCE-Anforderung aufgerufen hat.

Der Treiber ist für die Validierung aller Eingabeargumente verantwortlich. Insbesondere muss der Treiber Folgendes tun:

  • Überprüfen Sie, ob der GuidIndex-Wert zwischen null und GuidCount-1 liegt, basierend auf dem GuidCount-Member der WMILIB_CONTEXT-Struktur .
  • Vergewissern Sie sich, dass der Treiber den angegebenen Datenblock nicht für die Entfernung 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 festgelegte Anforderung vor dem Entfernen eingeht.
  • Vergewissern Sie sich, dass sich der InstanceIndex-Wert innerhalb des Bereichs instance Indizes befindet, die vom Treiber für den Datenblock unterstützt werden.
  • Vergewissern Sie sich, dass Puffer und PufferSize einen Datenblock mit gültiger Größe beschreiben, einschließlich aller Auffüllungen, die zwischen Datenelementen vorhanden sind, und dass der Inhalt des Puffers für den Datenblock gültig ist.
  • Vergewissern Sie sich, dass der angegebene Datenblock einer ist, für den der Treiber vom Aufrufer initiierte Änderungen zulässt. Anders ausgedrückt: Der Treiber sollte keine Änderungen an Datenblöcken zulassen, die schreibgeschützt sein sollen.
Gehen Sie nicht davon aus, dass der Threadkontext dem der initiierenden Anwendung im Benutzermodus entspricht. Möglicherweise hat ihn ein Treiber auf höherer Ebene geändert.

Wenn ein Treiber eine DpWmiSetDataBlock-Routine implementiert, muss der Treiber die Adresse der Routine im SetWmiDataBlock-Element der WMILIB_CONTEXT Struktur platzieren, die er an WmiSystemControl übergibt. Wenn ein Treiber keine DpWmiSetDataBlock-Routine implementiert, muss SetWmiDataBlock auf NULL festgelegt werden. Im letzteren Fall gibt WMI STATUS_READ_ONLY an den Aufrufer zurück.

Diese Routine kann ausgelagert werden.

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

Anforderungen

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

Weitere Informationen

IRP_MN_CHANGE_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiSystemControl