Partager via


IRP_MN_READ_CONFIG

Les pilotes de bus pour les bus disposant d’un espace de configuration doivent gérer cette demande pour leurs appareils enfants (PDO enfants). Les pilotes de filtre et de fonction ne gèrent pas cette demande.

Valeur

0x0F

Code majeur

IRP_MJ_PNP

Date d’envoi

Un pilote ou un autre composant système envoie cette IRP pour lire l’espace de configuration du bus parent d’un appareil.

Un pilote ou un autre composant système envoie cette IRP à IRQL < DISPATCH_LEVEL dans un contexte de thread arbitraire.

Paramètres d’entrée

Le membre Parameters.ReadWriteConfig de la structure IO_STACK_LOCATION est lui-même une structure contenant les informations suivantes :

ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG Length

Les membres de la structure peuvent être interprétés différemment par différents pilotes de bus, mais les membres sont généralement définis comme suit :

WhichSpace
Spécifie la zone de mémoire à laquelle accéder. Ce paramètre peut prendre les valeurs suivantes :

Valeur Bus Signification

PCI_WHICHSPACE_CONFIG

PCI

Espace de configuration PCI.

PCI_WHICHSPACE_ROM

PCI

Mémoire en lecture seule.

PCCARD_COMMON_MEMORY

PCCARD_COMMON_MEMORY_INDIRECT

PCMCIA

Mémoire PCCARD principale.

PCCARD_ATTRIBUTE_MEMORY

PCCARD_ATTRIBUTE_MEMORY_INDIRECT

PCMCIA

Espace d’attribut (configuration) PCMCIA.

PCCARD_PCI_CONFIGURATION_SPACE

PCMCIA

Espace de configuration PCI.

Les valeurs PCI_XXX sont définies dans Wdm.h. Les valeurs PCCARD_XXX sont définies dans Ntddpcm.h.

Tampon
Pointe vers une mémoire tampon dans laquelle retourner les informations demandées. Le composant qui envoie l’IRP alloue cette structure à partir de la mémoire paginée. Le format de la mémoire tampon est spécifique au bus.

Compenser
Spécifie un décalage dans l’espace de configuration.

Longueur
Spécifie le nombre d’octets à lire.

Paramètres de sortie

En cas de réussite, un pilote de bus remplit la mémoire tampon sur Parameters.ReadWriteConfig.Buffer avec les données demandées.

Bloc d’état E/S

Un pilote de bus définit Irp-IoStatus.Status> sur STATUS_SUCCESS ou sur un status d’erreur approprié, comme STATUS_INVALID_PARAMETER_n, STATUS_NO_SUCH_DEVICE ou STATUS_DEVICE_NOT_READY.

En cas de réussite, un pilote de bus définit Irp-IoStatus.Information> sur le nombre d’octets retournés.

Si un pilote de bus ne parvient pas à effectuer cette demande immédiatement, il peut marquer l’IRP en attente, retourner STATUS_PENDING et terminer l’IRP ultérieurement.

Opération

Un pilote de bus gère cette IRP pour ses appareils enfants (PDO enfants).

Les pilotes de fonction et de filtre ne gèrent pas cette IRP ; ils le passent au pilote inférieur suivant sans aucune modification à Irp-IoStatus>. État et ils ne définissent pas de routine IoCompletion.

Un pilote de bus qui gère cette requête doit case activée le paramètre WhichSpace pour s’assurer qu’il contient une valeur prise en charge par le pilote.

Consultez Plug-and-Play pour connaître les règles générales relatives à la gestion des Plug-and-Play irps mineurs.

Envoi de cet IRP

En règle générale, un pilote de fonction envoie cette IRP au pilote supérieur de la pile de périphériques à laquelle il est attaché et l’IRP est géré par le pilote de bus parent.

Pour plus d’informations sur l’envoi de IRP, consultez Gestion des IRP . Les étapes suivantes s’appliquent spécifiquement à cette IRP :

  • Allouez une mémoire tampon à partir d’un pool paginé et initialisez-la à zéros.

  • Définissez les valeurs dans l’emplacement de pile d’E/S suivant de l’IRP : définissez MajorFunctionsur IRP_MJ_PNP, définissez MinorFunction sur IRP_MN_READ_CONFIG et définissez les valeurs appropriées dans Parameters.ReadWriteConfig.

  • Initialisez IoStatus.Status pour STATUS_NOT_SUPPORTED.

  • Libérez l’IRP et la mémoire tampon quand ils ne sont plus nécessaires.

Les pilotes doivent envoyer cette IRP à partir d’IRQL < DISPATCH_LEVEL.

Un pilote peut accéder à l’espace de configuration d’un bus à DISPATCH_LEVEL via une routine d’interface de bus, si le pilote de bus parent prend en charge une telle interface. Pour obtenir une interface de bus, un pilote envoie une requête IRP_MN_QUERY_INTERFACE à la pile d’appareils dans laquelle le pilote est attaché. Le pilote appelle ensuite la routine appropriée retournée dans l’interface.

Par exemple, pour lire l’espace de configuration à partir de DISPATCH_LEVEL, un pilote peut appeler IRP_MN_QUERY_INTERFACE lors de l’initialisation du pilote pour obtenir l’interface BUS_INTERFACE_STANDARD à partir du pilote de bus parent. Le pilote envoie l’IRP de requête à partir du PASSIVE_LEVEL IRQL. Plus tard, à partir du code de l’IRQL DISPATCH_LEVEL, le pilote appelle la routine appropriée retournée dans l’interface, telle que la routine Interface.GetBusData .

Spécifications

En-tête

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

Voir aussi

IRP_MN_QUERY_INTERFACE

IRP_MN_WRITE_CONFIG