Partager via


Quand vérifier l’emplacement de la pile d’E/S du pilote

Un code de fonction d’E/S principal est défini dans l’emplacement de la pile d’E/ S du pilote pour chaque IRP entrante.

La routine de répartition d’un pilote doit case activée l’emplacement de la pile d’E/S du pilote pour l’IRP afin de déterminer ce qu’il faut faire si l’une des conditions suivantes est remplie :

  • La routine de répartition gère plusieurs codes de fonction d’E/S principaux.

  • La routine de distribution doit gérer un ensemble de codes de fonction secondaires pour certains codes de fonction principaux. Les irPs avec des codes de fonction secondaires incluent IRP_MJ_PNP et IRP_MJ_POWER, ainsi que certains IRP que le pilote de port SCSI et les pilotes de système de fichiers doivent gérer.

  • La routine de distribution d’un pilote de périphérique ou d’un pilote de niveau supérieur étroitement couplé gère IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL requêtes, qui ont un ensemble de codes de contrôle d’E/S associés.

Pour obtenir un pointeur vers l’emplacement de la pile d’E/S d’un pilote, sa routine de répartition appelle IoGetCurrentIrpStackLocation.

Les routines de répartition des pilotes de niveau supérieur appellent toujours IoGetCurrentIrpStackLocation et appellent également IoGetNextIrpStackLocation pour obtenir un pointeur vers l’emplacement de la pile d’E/S du pilote inférieur suivant pour les IRP qu’ils configurent pour le pilote inférieur suivant, lors du passage des IRP vers la pile de pilotes.

La routine DispatchDeviceControl ou DispatchInternalDeviceControl d’un pilote de périphérique, ou éventuellement de ses pilotes de classe étroitement couplés, doit déterminer quel code de contrôle d’E/S est défini dans l’emplacement de la pile d’E/S du pilote sur Parameters.DeviceIoControl.IoControlCode pour chaque requête. Le code de contrôle d’E/S est contenu dans l’emplacement de la pile d’E/S du pilote.

Dans la plupart des cas, la routine DispatchDeviceControl ou DispatchInternalDeviceControl d’un pilote de niveau supérieur transmet simplement une requête IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL au pilote inférieur suivant, après avoir configuré son emplacement de pile dans l’IRP. Toutefois, les pilotes de classe SCSI doivent case activée pour certains codes de contrôle d’E/S de port SCSI afin qu’ils puissent configurer correctement l’emplacement de la pile d’E/S du pilote de port SCSI avant de transmettre ces demandes.