IRP_MN_QUERY_ALL_DATA
Tous les pilotes qui prennent en charge WMI doivent gérer cet IRP. Un pilote peut gérer les runtimes d’intégration WMI en appelant WmiSystemControl ou en gérant lui-même l’IRP, comme décrit dans Gestion des requêtes WMI.
Si un pilote appelle WmiSystemControl pour gérer une requête IRP_MN_QUERY_ALL_DATA, WMI appelle à son tour la routine DpWmiQueryDataBlock du pilote.
Code principal
Moment de l’envoi
WMI envoie cet IRP pour rechercher toutes les instances d’un bloc de données donné.
WMI envoie cet IRP à IRQL = PASSIVE_LEVEL dans un contexte de thread arbitraire.
Paramètres d’entrée
Parameters.WMI.ProviderId dans l’emplacement de la pile d’E/S du pilote dans l’IRP pointe vers l’objet de périphérique du pilote qui doit répondre à la demande.
Parameters.WMI.DataPath pointe vers un GUID qui identifie le bloc de données.
Parameters.WMI.BufferSize indique la taille maximale de la mémoire tampon non paginé sur Parameters.WMI.Buffer, qui reçoit les données de sortie de la requête. La taille de la mémoire tampon doit être supérieure ou égale à sizeof(WNODE_ALL_DATA), ainsi que les tailles des noms d’instance et des données pour toutes les instances à retourner.
Paramètres de sortie
Si le pilote gère les runtimes d’intégration WMI en appelant WmiSystemControl, WMI remplit un WNODE_ALL_DATA en appelant la routine DpWmiQueryDataBlock du pilote une fois pour chaque bloc inscrit par le pilote.
Sinon, le pilote remplit une structure WNODE_ALL_DATA sur Parameters.WMI.Buffer comme suit :
Définit WnodeHeader.BufferSize sur le nombre d’octets de l’ensemble de la WNODE_ALL_DATA à renvoyer, définit WnodeHeader.Timestamp sur la valeur retournée par KeQuerySystemTime et définit WnodeHeader.Flags comme approprié pour les données à renvoyer.
Définit InstanceCount sur le nombre d’instances à retourner.
Si le bloc utilise des noms d’instances dynamiques, définit OffsetInstanceNameOffsets sur le décalage en octets du début de l’WNODE_ALL_DATA vers l’emplacement où commence un tableau de décalages ULONG. Chaque élément de ce tableau est le décalage entre le WNODE_ALL_DATA et l’emplacement où chaque nom d’instance dynamique est stocké. Chaque nom d’instance dynamique est stocké sous la forme d’une chaîne Unicode comptée où le nombre est un USHORT suivi de la chaîne Unicode. Le nombre n’inclut aucun caractère null de fin qui peut faire partie de la chaîne Unicode. Si la chaîne Unicode inclut un caractère null de fin, ce caractère Null doit toujours correspondre à la taille établie dans WNodeHeader.BufferSize.
Si toutes les instances sont de la même taille :
- Définit WNODE_FLAG_FIXED_INSTANCE_SIZE dans WnodeHeader.Flags et définit FixedInstanceSize sur cette taille, en octets.
- Écrit les données d’instance à partir de DataBlockOffset, avec remplissage afin que chaque instance soit alignée sur une limite de 8 octets. Par exemple, si FixedInstanceSize est 6, le pilote ajoute 2 octets de remplissage entre les instances.
Si les instances varient en taille :
Efface WNODE_FLAG_FIXED_INSTANCE_SIZE dans WnodeHeader.Flags et écrit un tableau de structures InstanceCount OFFSETINSTANCEDATAANDLENGTH à partir de OffsetInstanceDataAndLength. Chaque structure OFFSETINSTANCEDATAANDLENGTH spécifie le décalage en octets du début de la structure WNODE_ALL_DATA au début des données pour chaque instance et la longueur des données. DataBlockOffset n’est pas utilisé.
Écrit les données d’instance en suivant le dernier élément du tableau OffsetInstanceDataAndLength , ainsi que le remplissage afin que chaque instance soit alignée sur une limite de 8 octets.
Si la mémoire tampon sur Parameters.WMI.Buffer est trop petite pour recevoir toutes les données, un pilote remplit la taille nécessaire dans une structure WNODE_TOO_SMALL sur Parameters.WMI.Buffer. Si la mémoire tampon est inférieure à sizeof(WNODE_TOO_SMALL), le pilote échoue à l’IRP et retourne STATUS_BUFFER_TOO_SMALL.
Bloc d’état d’E/S
Si le pilote gère l’IRP en appelant WmiSystemControl, WMI définit Irp-IoStatus.Status> et Irp-IoStatus.Information> dans le bloc d’état d’E/S.
Sinon, le pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur un état d’erreur approprié, par exemple :
STATUS_BUFFER_TOO_SMALL
STATUS_WMI_GUID_NOT_FOUND
En cas de réussite, un pilote définit Irp-IoStatus.Information> sur le nombre d’octets écrits dans la mémoire tampon sur Parameters.WMI.Buffer.
Operation
Un pilote peut gérer les runtimes d’intégration WMI en appelant WmiSystemControl ou en gérant lui-même l’IRP, comme décrit dans Gestion des requêtes WMI.
Si un pilote gère les runtimes d’intégration WMI en appelant WmiSystemControl, cette routine appelle la routine DpWmiQueryDataBlock du pilote.
Si un pilote gère une requête IRP_MN_QUERY_ALL_DATA , il doit le faire uniquement si Parameters.WMI.ProviderId pointe vers le même objet d’appareil que celui passé à IoWMIRegistrationControl. Sinon, le pilote doit transférer la requête au pilote suivant.
Avant de gérer la requête, le pilote doit déterminer si Parameters.WMI.DataPath pointe vers un GUID pris en charge par le pilote. Si ce n’est pas le cas, le pilote doit échouer à l’IRP et retourner STATUS_WMI_GUID_NOT_FOUND.
Si le pilote prend en charge le bloc de données, il doit effectuer les opérations suivantes :
Vérifiez que Parameters.WMI.BufferSize spécifie une mémoire tampon suffisamment grande pour recevoir toutes les données retournées par le pilote.
Renseignez une structure WNODE_ALL_DATA sur Parameters.WMI.Buffer avec des données pour toutes les instances de ce bloc de données.
Spécifications
En-tête |
Wdm.h (include Wdm.h, Ntddk.h ou Ntifs.h) |