Fonction ScsiPortWmiSetData (scsiwmi.h)
La routine ScsiPortWmiSetData met à jour la structure WNODE_ALL_DATA dans le contexte de la demande pour spécifier la position et la longueur des données d’un instance.
Syntaxe
PVOID ScsiPortWmiSetData(
[in] PSCSIWMI_REQUEST_CONTEXT RequestContext,
[in] ULONG InstanceIndex,
[in] ULONG DataLength,
[out] PULONG BufferAvail,
[in, out] PULONG SizeNeeded
);
Paramètres
[in] RequestContext
Pointeur vers une structure de type SCSIWMI_REQUEST_CONTEXT qui contient le contexte de demande pour un SRB WMI.
[in] InstanceIndex
Contient un index qui indique le instance pour lequel la position et la longueur des données instance doivent être spécifiées.
[in] DataLength
Spécifie le nombre d’octets de données requis pour décrire le instance.
[out] BufferAvail
Doit contenir, lors de l’entrée, le nombre d’octets d’espace de mémoire tampon dans la structure WNODE_ALL_DATA qui peut être utilisé pour décrire instance noms et données. Au retour, ce membre contient le nombre d’octets d’espace tampon restant.
Il existe trois routines WMI de port SCSI qui retournent une valeur pour la taille de mémoire tampon disponible dans leur paramètre BufferAvail :
ScsiPortWmiSetData
Le pilote miniport doit d’abord appeler ScsiPortWmiSetInstanceCount , mais une fois que ScsiPortWmiSetInstanceCount a été appelé, peu importe dans quel ordre le minidriver appelle ScsiPortWmiSetData et ScsiPortWmiSetInstanceName. Lors de l’appel de ScsiPortWmiSetData ou ScsiPortWmiSetInstanceName, la valeur transmise à la routine dans son paramètre BufferAvail doit être identique à la valeur retournée dans le paramètre BufferAvail par la dernière routine WMI du port SCSI. Par instance, supposons que le minidriver appelle d’abord ScsiPortWmiSetInstanceCount et que cette routine retourne une valeur de 1 000 dans son paramètre BufferAvail. Ensuite, le minidriver appelle ScsiPortWmiSetData qui retourne la valeur 500 dans son paramètre BufferAvail . Enfin, le minidriver appelle ScsiPortWmiSetInstanceName qui retourne la valeur 200 dans son paramètre BufferAvail . La valeur initiale de 1 000 doit être passée à ScsiPortWmiSetData dans BufferAvail, et la valeur de 500 doit être passée à ScsiPortWmiSetInstanceName.
S’il n’y a pas suffisamment de mémoire disponible pour ajouter de nouvelles instance données de taille d’octets DataLength, un zéro est retourné dans le membre BufferAvail.
[in, out] SizeNeeded
Indique, en entrée, le nombre d’octets nécessaires pour décrire l’intégralité du WNODE avant d’ajouter les données descriptives pour le instance spécifié par InstanceIndex. Au retour, ce membre contiendra la taille du WNODE, y compris les données du nouveau instance.
Valeur retournée
La routine ScsiPortWmiSetData retourne un pointeur vers la mémoire tampon où l’appelant peut stocker des informations descriptives sur les instance identifiés par InstanceIndex. Si ScsiPortWmiSetData ne peut pas allouer suffisamment de mémoire pour les données instance, ou si le WNODE contenu dans le contexte de la requête n’est pas de type WNODE_ALL_DATA, ScsiPortWmiSetData retourne NULL.
Remarques
Le minidriver doit appeler ScsiPortWmiSetInstanceCount avant d’appeler ScsiPortWmiSetData.
Le paramètre RequestContext pointe vers une structure de contexte de requête, SCSIWMI_REQUEST_CONTEXT, qui contient des informations associées à un bloc de requête SCSI (SRB) WMI (Windows Management Instrumentation ). La structure de contexte de requête, à son tour, contient l’une des structures de WNODE_XXX WMI utilisées par le système WMI pour transmettre des données entre les consommateurs de données en mode utilisateur et les fournisseurs de données en mode noyau, tels que les pilotes.
La routine ScsiPortWmiSetData nécessite que la structure WNODE définie dans le contexte de la requête soit de type WNODE_ALL_DATA. En effet , ScsiPortWmiSetData peut spécifier l’emplacement et la longueur des mémoires tampons de données pour toutes les instances associées à un bloc de données WMI. Contrairement à la structure WNODE_SINGLE_INSTANCE qui contient des informations sur un seul instance, la structure WNODE_ALL_DATA contient un tableau de pointeurs vers des zones tampons pour plusieurs instances, et ScsiPortWmiSetData utilise le paramètre InstanceIndex comme index dans ce tableau pour initialiser l’élément de tableau approprié pour un instance particulier. Chaque élément de tableau, une fois initialisé, contient la taille et l’emplacement d’une zone de mémoire tampon pour un instance.
La mémoire allouée pour le contexte de requête doit rester valide jusqu’à ce que le pilote miniport ait appelé ScsiPortWmiPostProcess, et que ScsiPortWmiPostProcess retourne la status SRB finale et la taille de mémoire tampon. Si le SRB peut être suspendu, la mémoire du contexte de requête doit être allouée à partir de l’extension SRB. Si le SRB ne peut pas être suspendu, la mémoire peut être allouée à partir d’une trame de pile qui ne sort pas de l’étendue.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | scsiwmi.h (inclure Miniport.h, Scsi.h) |