Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le gestionnaire d'E/S attribue à chaque pilote dans une série de pilotes en couches un emplacement de pile d'E/S pour chaque IRP qu'il configure. Chaque position dans la pile d’E/S comprend une structure IO_STACK_LOCATION.
Le gestionnaire d’E/S crée un tableau d’emplacements de pile d’E/S pour chaque IRP, avec un élément de tableau correspondant à chaque pilote dans une chaîne de pilotes en couches. Chaque pilote possède l’un des emplacements de pile dans le paquet et appelle IoGetCurrentIrpStackLocation pour obtenir des informations spécifiques au pilote sur l’opération d’E/S.
Chaque pilote d’une telle chaîne est chargé d’appeler IoGetNextIrpStackLocation, puis de configurer l’emplacement de la pile d’E/S du pilote suivant. Tout emplacement de pile d’E/S du pilote de niveau supérieur peut également être utilisé pour stocker le contexte d’une opération afin que la routine IoCompletion du pilote puisse effectuer ses opérations de nettoyage.
Le traitement des IRP dans la figure intitulée Pilotes en couches montre deux emplacements de la pile d'E/S dans l’IRP d'origine, car il représente deux pilotes, un pilote de système de fichiers et un pilote de dispositif de stockage de masse. Les IRPs alloués par le pilote présentés dans la figure Traitement des IRPs dans les pilotes en couches n'ont pas d'emplacement dans la pile pour le FSD (Pilote du système de fichiers) qui les a créés. Tout pilote de niveau supérieur qui alloue des irPs pour les pilotes de niveau inférieur détermine également le nombre d’emplacements de pile d’E/S dont les nouveaux irps doivent avoir, en fonction de la valeur StackSize de l’objet de périphérique du pilote suivant.
La figure suivante montre le contenu de l’IRP plus en détail.
Comme illustré dans la figure, chaque emplacement de pile d’E/S spécifique au pilote dans un IRP contient les informations générales suivantes :
Code de fonction principal (IRP_MJ_XXX), indiquant l’opération de base que le pilote doit effectuer
Pour certains codes de fonction majeurs gérés par les pilotes FSD, les pilotes SCSI de niveau supérieur et tous les pilotes PnP, un code de fonction secondaire (IRP_MN_XXX) indique quelle sous-catégorie de l'opération principale le pilote doit effectuer.
Ensemble d’arguments spécifiques à l’opération, tels que la longueur et l’emplacement de départ d’une mémoire tampon dans laquelle ou à partir duquel le pilote transfère les données
Pointeur vers l’objet de périphérique créé par le pilote, représentant l’appareil cible (physique, logique ou virtuel) pour l’opération demandée
Pointeur vers l’objet de fichier, représentant un fichier ouvert, un appareil, un répertoire ou un volume
Un pilote de système de fichiers accède à l’objet de fichier via sa position dans la pile d’E/S dans les IRPs. Les autres pilotes ignorent généralement l’objet de fichier.
L’ensemble de codes de fonction principaux et secondaires IRP qu’un pilote particulier gère peut être spécifique au type d’appareil. Toutefois, les pilotes de niveau le plus bas et les pilotes intermédiaires (y compris les pilotes de fonction PnP et de filtre) gèrent généralement l’ensemble de requêtes de base suivant :
IRP_MJ_CREATE : ouvrez l’objet d’appareil cible, indiquant qu’il est présent et disponible pour les opérations d’E/S
IRP_MJ_READ : transférer des données à partir de l’appareil
IRP_MJ_WRITE : transférer des données vers l’appareil
IRP_MJ_DEVICE_CONTROL : configurer (ou réinitialiser) l’appareil, en fonction d’un code de contrôle D/S spécifique au type d’appareil défini par le système (IOCTL)
IRP_MJ_CLOSE : fermez l’objet d’appareil cible
IRP_MJ_PNP : effectuez une opération Plug-and-Play sur l’appareil. Une demande IRP_MJ_PNP est envoyée par le gestionnaire PnP via le gestionnaire d’E/S.
IRP_MJ_POWER : effectuez une opération d’alimentation sur l’appareil. Une demande de IRP_MJ_POWER est envoyée par le gestionnaire d’alimentation via le gestionnaire d’E/S.
Pour plus d'informations sur les principaux codes de fonction IRP que les pilotes doivent traiter, consultez Codes de fonction IRP majeurs.
En général, le gestionnaire d’E/S envoie des IRPs avec au moins deux emplacements de pile d’E/S aux pilotes de périphériques de stockage en masse, car un système de fichiers est superposé sur d’autres pilotes pour les périphériques de stockage en masse. Le gestionnaire d’E/S envoie des irps avec un emplacement de pile unique à n’importe quel pilote qui n’a pas d’autre pilote superposé au-dessus de celui-ci.
Toutefois, le gestionnaire d’E/S prend en charge l’ajout d’un nouveau pilote à n’importe quelle chaîne de pilotes existants dans le système. Par exemple, un pilote miroir intermédiaire qui sauvegarde des données sur une partition de disque donnée peut être inséré entre une paire de pilotes, tels que le pilote du système de fichiers et le pilote à un niveau inférieur indiqué dans la figure intitulée Traitement des IRPs dans les pilotes en couches. Lorsque ce nouveau pilote s’attache à la pile d’appareils, le gestionnaire d’E/S ajuste le nombre d’emplacements de pile d’E/S dans tous les IRPs qu’il envoie au système de fichiers, au miroir et aux pilotes de niveau le plus bas. Chaque IRP que le système de fichiers dans les IRPs de traitement dans les pilotes en couches alloués contiendrait également un autre emplacement de pile d’E/S pour une nouvelle interface de pilote miroir.
Notez que cette prise en charge de l’ajout de nouveaux pilotes à une chaîne existante implique certaines restrictions sur l’accès de tout pilote particulier aux emplacements de pile d’E/S dans les IRP :
Un pilote de niveau supérieur dans une chaîne de pilotes en couches ne peut accéder en toute sécurité qu’à ses propres emplacements de pile d’E/S et de la pile d’E/S du pilote de niveau inférieur suivant dans n’importe quel IRP. Un tel pilote doit configurer l’emplacement de la pile d’E/S pour le pilote de niveau inférieur suivant dans les irPs. Toutefois, lors de la conception d’un pilote de niveau supérieur, vous ne pouvez pas prédire quand (ou si) un nouveau pilote sera ajouté à la chaîne existante juste en dessous de votre pilote.
Par conséquent, vous devez supposer que tout pilote ajouté ultérieurement gère les mêmes codes de fonction principaux IRP (IRP_MJ_XXX) que le pilote de niveau supérieur déplacé.
Le pilote de niveau le plus bas dans une chaîne de pilotes en couches peut accéder en toute sécurité uniquement à son propre emplacement de pile d’E/S dans n’importe quel IRP. Lors de la conception d’un tel pilote, vous ne pouvez pas prédire quand (ou si) un nouveau pilote sera ajouté à la chaîne existante au-dessus de votre pilote de périphérique.
Dans la conception d’un pilote de niveau le plus bas, supposons que le pilote peut continuer à traiter les irPs à l’aide des informations transmises dans son propre emplacement de pile d’E/S, quelle que soit la source d’origine d’un IRP donné et que de nombreux pilotes sont superposés au-dessus de celui-ci.