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 à l’emplacement de la pile d’E/S du pilote pour chaque IRP entrant.

La routine de répartition d’un pilote doit vérifier 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 répartition doit gérer un ensemble de codes de fonction secondaires pour certains codes de fonction principaux. Des IRP avec des codes de fonction mineurs incluent IRP_MJ_PNP et IRP_MJ_POWER, ainsi que certains IRP que le pilote de port SCSI et les pilotes du système de fichiers doivent gérer.

  • La routine de répartition d’un pilote de périphérique ou d’un pilote de niveau supérieur étroitement couplé gère les requêtes IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL , qui ont un ensemble associé de codes de contrôle d’E/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 pile d’E/S suivant du pilote inférieur pour les IRPs qu’ils configurent pour le pilote suivant, lors du passage d’IRPs vers le bas de la pile des 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/S du pilote à Parameters.DeviceIoControl.IoControlCode pour chaque requête. Le code de contrôle d’E/S se trouve à 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 vérifier 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.