Partager via


WMI_SET_DATABLOCK_CALLBACK fonction de rappel (wmilib.h)

La routine DpWmiSetDataBlock modifie tous les éléments de données d’un seul instance d’un bloc de données. Cette routine est facultative.

Syntaxe

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
)
{...}

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 par son index de base zéro dans la liste des GUID fournis par le pilote dans la structure WMILIB_CONTEXT qu’il a passée à WmiSystemControl.

[in] InstanceIndex

Si le bloc spécifié par GuidIndex a plusieurs instances, InstanceIndex spécifie le instance.

[in] BufferSize

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

[in] Buffer

Pointeur vers une mémoire tampon qui contient de nouvelles valeurs pour le instance.

Valeur retournée

DpWmiSetDataBlock retourne STATUS_SUCCESS ou une erreur appropriée status comme suit :

Si le pilote ne peut pas terminer la demande immédiatement, il peut retourner STATUS_PENDING.

Remarques

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

Le pilote est chargé de valider 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 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 la suppression.
  • 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 Buffer et BufferSize décrivent un bloc de données de taille valide, y compris tout remplissage existant entre les éléments de données, et que le contenu de la mémoire tampon est valide pour le bloc de données.
  • Vérifiez que le bloc de données spécifié est un bloc pour lequel le pilote autorise les modifications initiées par l’appelant. En d’autres termes, le pilote ne doit pas autoriser les modifications apportées aux blocs de données que vous aviez l’intention d’être en lecture seule.
Ne partez pas du principe que le contexte du thread est celui de l’application en mode utilisateur de lancement. Un pilote de niveau supérieur peut l’avoir modifié.

Si un pilote implémente une routine DpWmiSetDataBlock , il doit placer l’adresse de la routine dans le membre SetWmiDataBlock de la structure WMILIB_CONTEXT qu’il transmet à WmiSystemControl. Si un pilote n’implémente pas de routine DpWmiSetDataBlock , il doit définir SetWmiDataBlock sur NULL. Dans ce dernier cas, WMI retourne STATUS_READ_ONLY à l’appelant.

Cette routine peut être paginable.

Pour plus d’informations sur l’implémentation de cette routine, consultez Calling WmiSystemControl to Handle WMI IRPs.

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_INSTANCE

WMILIB_CONTEXT

WmiSystemControl