Traitement des IIP WMI dans une routine DispatchSystemControl
Un pilote qui gère les IRP WMI dans sa routine DispatchSystemControl ne doit gérer ce type d’IRP que si le pointeur de l’objet d’appareil à Parameters.WMI.ProviderId correspond au pointeur transmis par le pilote dans son appel à IoWMIRegistrationControl. Sinon, le pilote doit transférer l’IRP au pilote inférieur suivant.
Si le pilote gère la demande, il doit :
Vérifiez le GUID sur Parameters.WMI.DataPath pour déterminer s’il représente un bloc de données pris en charge par le pilote et, si ce n’est pas le cas, échouez l’IRP avec STATUS_WMI_GUID_NOT_FOUND.
Un pilote doit case activée la structure d’entrée WNODE_XXX sur Parameters.WMI.Buffer pour le nom instance lors de la gestion de l’une des demandes suivantes :
IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Le pilote doit case activée pour le nom de instance comme suit :
Si WNODE_FLAG_STATIC_INSTANCE_NAMES est défini dans WnodeHeader.Flags, utilisez InstanceIndex comme index dans la liste des noms de instance statiques du pilote pour ce bloc.
Si WNODE_FLAG_STATIC_INSTANCE_NAMES est clair dans WnodeHeader.Flags, utilisez OffsetInstanceName comme décalage vers la chaîne de nom instance dans la structure d’entrée WNODE_XXX. OffsetInstanceName est le décalage en octets entre le début de la structure et un USHORT qui indique la longueur de la chaîne de nom instance en octets (pas de caractères), y compris le point de terminaison NUL le cas échéant, suivi de la chaîne elle-même en Unicode.
Si le pilote ne peut pas localiser le instance spécifié par InstanceIndex ou OffsetInstanceName, il doit échouer l’IRP avec STATUS_WMI_INSTANCE_NOT_FOUND.
Pour une demande de IRP_MN_EXECUTE_METHOD, case activée MethodID dans le WNODE_METHOD_ITEM d’entrée et, si la méthode n’est pas valide pour ce bloc de données, échouez l’IRP avec STATUS_WMI_ITEMID_NOT_FOUND.
Si la requête génère une sortie, un pilote doit case activée la taille de la mémoire tampon sur Parameters.WMI.BufferSize lors de la gestion de l’une des demandes suivantes :
IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Si la mémoire tampon est trop petite pour recevoir la sortie, mais au moins sizeof(WNODE_TOO_SMALL), le pilote doit réussir l’IRP et écrire une structure WNODE_TOO_SMALL dans la mémoire tampon sur Parameters.WMI.Buffer. Si la mémoire tampon est inférieure à sizeof(WNODE_TOO_SMALL), le pilote échoue à l’IRP avec un code NTSTATUS de STATUS_BUFFER_TOO_SMALL.
Si la requête génère une sortie et que la taille de la mémoire tampon est suffisante, écrivez la sortie suivante dans la mémoire tampon à l’adresse Parameters.WMI.Buffer :
- Pour une requête de IRP_MN_QUERY_ALL_DATA , le pilote écrit une structure de WNODE_ALL_DATA qui contient des données pour toutes les instances du bloc de données spécifié.
- Pour une demande de IRP_MN_QUERY_SINGLE_INSTANCE, le pilote écrit une structure de WNODE_SINGLE_INSTANCE qui contient des données pour le instance spécifié d’un bloc de données.
- Pour une IRP_MN_EXECUTE_METHOD si la méthode génère une sortie, le pilote écrit la sortie de la méthode au format déterminé par le pilote en suivant l’entrée WNODE_METHOD_ITEM dans la mémoire tampon (en remplaçant les données d’entrée, le cas échéant).
Définissez Irp-IoStatus.Information> sur le nombre d’octets écrits dans la mémoire tampon sur Parameters.WMI.Buffer et Irp-IoStatus.Status> sur STATUS_SUCCESS.
Appelez IoCompleteRequest pour terminer l’IRP.
Pour plus d’informations, consultez WMI WNODE_XXX Structures.