WMI_SET_DATAITEM_CALLBACK fonction de rappel (wmilib.h)

La routine DpWmiSetDataItem modifie un seul élément de données dans un instance d’un bloc de données. Cette routine est facultative.

Syntaxe

WMI_SET_DATAITEM_CALLBACK WmiSetDataitemCallback;

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

Paramètres

[in] DeviceObject

Pointeur vers la structure de DEVICE_OBJECT WDM du pilote.

[in] Irp

Pointeur vers l’IRP.

[in] GuidIndex

Spécifie le bloc de données en fournissant un index de base zéro dans la liste des GUID fournis par le pilote dans la structure WMILIB_CONTEXT qu’il a transmise à WmiSystemControl.

[in] InstanceIndex

Si le bloc spécifié par GuidIndex a plusieurs instances, InstanceIndex est une valeur de base zéro qui spécifie le instance.

[in] DataItemId

Spécifie l’ID de l’élément de données à définir.

[in] BufferSize

Spécifie la taille en octets de la mémoire tampon dans Mémoire tampon.

[in] Buffer

Pointeur vers une mémoire tampon qui contient la nouvelle valeur de l’élément de données.

Valeur retournée

DpWmiSetDataItem retourne STATUS_SUCCESS ou un code d’erreur approprié, par exemple :

Remarques

WMI appelle la routine DpWmiSetDataItem d’un pilote après que le pilote a appelé WmiSystemControl en réponse à une demande de IRP_MN_CHANGE_SINGLE_ITEM .

N’implémentez pas DpWmiSetDataItem , sauf si vous êtes sûr qu’un composant en mode utilisateur fourni par le système nécessite cette fonctionnalité. Si vous implémentez une routine DpWmiSetDataItem , le pilote doit placer l’adresse de la routine dans le membre SetWmiDataItem de la structure WMILIB_CONTEXT qu’il transmet à WmiSystemControl. Si vous n’implémentez pas de routine DpWmiSetDataItem , le pilote doit définir SetWmiDataItem sur NULL. Dans ce dernier cas, WMI retourne STATUS_READ_ONLY à l’appelant.

Le pilote est responsable de la validation de tous les arguments d’entrée. Plus précisément, le pilote doit effectuer les opérations suivantes :

  • Vérifiez que la valeur GuidIndex est comprise entre zéro et GuidCount-1, en fonction du membre GuidCount de la structure WMILIB_CONTEXT .
  • Vérifiez que le pilote n’a pas marqué le bloc de données spécifié pour la suppression. Si le pilote a récemment spécifié l’indicateur de WMIREG_FLAG_REMOVE_GUID dans une structure WMIGUIDREGINFO contenue dans une structure WMILIB_CONTEXT , il est possible qu’une demande de jeu arrive avant que la suppression ne se produise.
  • Vérifiez que la valeur InstanceIndex se trouve dans la plage des index instance pris en charge par le pilote pour le bloc de données.
  • Vérifiez que la valeur DataItemId se trouve dans la plage des identificateurs d’élément de données pris en charge par le pilote pour le bloc de données.
  • Vérifiez que Buffer et BufferSize décrivent un élément de données de taille valide et que le contenu de la mémoire tampon est valide pour l’élément de données.
  • Vérifiez que l’élément de données spécifié est celui pour lequel le pilote autorise les modifications initiées par l’appelant. En d’autres termes, le pilote ne doit pas autoriser les modifications des éléments de données que vous envisagez d’être en lecture seule.
Ne partez pas du principe que le contexte de thread est celui de l’application en mode utilisateur de lancement. Un pilote de niveau supérieur peut l’avoir modifié.

Cette routine peut être paginable.

Pour plus d’informations sur l’implémentation de cette routine, consultez Appel de WmiSystemControl pour gérer les IIP WMI.

Configuration requise

Condition requise Valeur
Plateforme cible Desktop (Expérience utilisateur)
En-tête wmilib.h (inclure Wmilib.h)
IRQL Appelé à PASSIVE_LEVEL.

Voir aussi

IRP_MN_CHANGE_SINGLE_ITEM

WMILIB_CONTEXT

WmiSystemControl