IRP_MN_QUERY_ALL_DATA

Tous les pilotes qui prennent en charge WMI doivent gérer cette IRP. Un pilote peut gérer les irps WMI en appelant WmiSystemControl ou en gérant l’IRP lui-même, comme décrit dans Gestion des demandes WMI.

Si un pilote appelle WmiSystemControl pour gérer une demande de IRP_MN_QUERY_ALL_DATA , WMI appelle à son tour la routine DpWmiQueryDataBlock de ce pilote.

Code majeur

IRP_MJ_SYSTEM_CONTROL

Date d’envoi

WMI envoie cette IRP pour interroger toutes les instances d’un bloc de données donné.

WMI envoie cette 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), plus les tailles des noms et des données de instance pour toutes les instances à retourner.

Paramètres de sortie

Si le pilote gère les irps WMI en appelant WmiSystemControl, WMI remplit une 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 dans Parameters.WMI.Buffer comme suit :

  • Définit WnodeHeader.BufferSize sur le nombre d’octets de l’ensemble des WNODE_ALL_DATA à retourner, définit WnodeHeader.Timestamp sur la valeur retournée par KeQuerySystemTime et définit WnodeHeader.Flags en fonction des données à retourner.

  • Définit InstanceCount sur le nombre d’instances à retourner.

  • Si le bloc utilise des noms de instance dynamiques, définit OffsetInstanceNameOffsets sur le décalage en octets du début du WNODE_ALL_DATA à l’endroit 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 de instance dynamique est stocké. Chaque nom de 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 pouvant 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 ont la même taille :

    • Définit WNODE_FLAG_FIXED_INSTANCE_SIZE dans WnodeHeader.Flags et définit FixedInstanceSize sur cette taille, en octets.
    • Écrit instance données à partir de DataBlockOffset, avec remplissage afin que chaque instance soit aligné sur une limite de 8 octets. Par exemple, si FixedInstanceSize a la valeur 6, le pilote ajoute 2 octets de remplissage entre les instances.
  • Si la taille des instances varie :

    • Efface WNODE_FLAG_FIXED_INSTANCE_SIZE dans WnodeHeader.Flags et écrit un tableau de structures InstanceCountOFFSETINSTANCEDATAANDLENGTH à partir de OffsetInstanceDataAndLength. Chaque structure OFFSETINSTANCEDATAANDLENGTH spécifie le décalage en octets entre le début de la structure WNODE_ALL_DATA et le début des données pour chaque instance, ainsi que la longueur des données. DataBlockOffset n’est pas utilisé.

    • Écrit instance données qui suivent le dernier élément du tableau OffsetInstanceDataAndLength, ainsi qu’un remplissage afin que chaque instance soit aligné 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 de 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 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’E/S status.

Sinon, le pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur une erreur appropriée status comme suit :

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.

Opération

Un pilote peut gérer les irps WMI en appelant WmiSystemControl ou en gérant l’IRP lui-même, comme décrit dans Gestion des demandes WMI.

Si un pilote gère les irps WMI en appelant WmiSystemControl, cette routine appelle la routine DpWmiQueryDataBlock du pilote.

Si un pilote gère une demande de IRP_MN_QUERY_ALL_DATA , il ne doit le faire que si Parameters.WMI.ProviderId pointe vers le même objet de périphérique que celui que le pilote a transmis à IoWMIRegistrationControl. Sinon, le pilote doit transférer la demande au pilote inférieur suivant.

Avant de gérer la demande, 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 que le pilote retournera.

  • Renseignez une structure WNODE_ALL_DATA dans Parameters.WMI.Buffer avec les données de toutes les instances de ce bloc de données.

Spécifications

En-tête

Wdm.h (inclure Wdm.h, Ntddk.h ou Ntifs.h)

Voir aussi

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA