Fonction ScsiPortWmiSetData (scsiwmi.h)

La routine ScsiPortWmiSetData met à jour la structure WNODE_ALL_DATA dans le contexte de requête pour spécifier la position et la longueur des données d’une instance.

Note Le pilote de port SCSI et les modèles de pilotes miniport SCSI peuvent être modifiés ou indisponibles à l’avenir. Au lieu de cela, nous vous recommandons d’utiliser le pilote Storport et les modèles de pilotes miniport Storport .
 

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 requête d’un SRB WMI.

[in] InstanceIndex

Contient un index qui indique l’instance pour laquelle la position et la longueur des données d’instance doivent être spécifiées.

[in] DataLength

Spécifie le nombre d’octets de données nécessaires pour décrire l’instance.

[out] BufferAvail

Doit contenir, en entrée, le nombre d’octets d’espace tampon dans la structure WNODE_ALL_DATA qui peut être utilisée pour décrire les noms d’instance et les données. En retour, ce membre contient le nombre d’octets d’espace tampon qui restent.

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 :

ScsiPortWmiSetInstanceCount

ScsiPortWmiSetData

ScsiPortWmiSetInstanceName

Le pilote miniport doit d’abord appeler ScsiPortWmiSetInstanceCount , mais après l’appel de ScsiPortWmiSetInstanceCount , il n’a pas d’importance dans quel ordre le minidriver appelle ScsiPortWmiSetData et ScsiPortWmiSetInstanceName. Lors de l’appel de ScsiPortWmiSetData ou ScsiPortWmiSetInstanceName, la valeur passée à la routine dans son paramètre BufferAvail doit être identique à la valeur retournée dans le paramètre BufferAvail par la routine WMI du port SCSI la plus récente. Par exemple, 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 une valeur de 500 dans son paramètre BufferAvail . Enfin, le minidriver appelle ScsiPortWmiSetInstanceName qui retourne une valeur de 200 dans son paramètre BufferAvail . La valeur initiale de 1 000 doit être passée à ScsiPortWmiSetData dans BufferAvail, et la valeur 500 doit être passée à ScsiPortWmiSetInstanceName.

S’il n’y a pas suffisamment de mémoire disponible pour ajouter de nouvelles données d’instance de taille DataLength octets, un zéro est retourné dans le membre BufferAvail .

[in, out] SizeNeeded

Indique, lors de l’entrée, le nombre d’octets nécessaires pour décrire l’intégralité du WNODE avant d’ajouter les données descriptives pour l’instance spécifiée par InstanceIndex. Au retour, ce membre contient la taille du WNODE, y compris les données de la nouvelle instance.

Valeur retournée

La routine ScsiPortWmiSetData retourne un pointeur vers la mémoire tampon où l’appelant peut stocker des informations descriptives sur l’instance identifiée par InstanceIndex. Si ScsiPortWmiSetData ne peut pas allouer suffisamment de mémoire pour les données d’instance, ou si le WNODE contenu dans le contexte de requête n’est pas de type WNODE_ALL_DATA, ScsiPortWmiSetData retourne NULL.

Notes

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 (WMI) Windows Management Instrumentation (SRB). La structure de contexte de requête contient à son tour l’une des structures WMI WNODE_XXX 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 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 une instance unique, la structure WNODE_ALL_DATA contient un tableau de pointeurs vers des zones de mémoire tampon pour plusieurs instances, et ScsiPortWmiSetData utilise le paramètre InstanceIndex comme index dans ce tableau pour initialiser l’élément de tableau approprié pour une instance particulière. Chaque élément de tableau, une fois initialisé, contient la taille et l’emplacement d’une zone de mémoire tampon pour une instance.

La mémoire allouée pour le contexte de requête doit rester valide jusqu’à ce que le pilote miniport appelle ScsiPortWmiPostProcess et ScsiPortWmiPostProcess retourne l’état SRB final et la taille de la mémoire tampon. Si le SRB peut pendre, la mémoire du contexte de requête doit être allouée à partir de l’extension SRB. Si le SRB ne peut pas pendre, la mémoire peut être allouée à partir d’un frame de pile qui ne dépasse pas l’étendue.

Spécifications

   
Plateforme cible Bureau
En-tête scsiwmi.h (inclure Miniport.h, Scsi.h)

Voir aussi

SCSIWMI_REQUEST_CONTEXT

WNODE_ALL_DATA

WNODE_SINGLE_INSTANCE