Routines StartIo dans les pilotes Higher-Level
Tout pilote de niveau supérieur peut avoir une routine StartIo . Toutefois, un tel pilote est peu susceptible d’être interopérable avec les pilotes de niveau inférieur existants et est susceptible de présenter des caractéristiques de performances médiocres.
Une routine StartIo dans un pilote de niveau supérieur a les effets suivants :
Les irps entrants peuvent être mis en file d’attente en appelant IoStartPacket à partir de la ou les routines DispatchXxx du pilote et IoStartNextPacket à partir de sa ou ses routines IoCompletion , ce qui entraîne le traitement des IRPs une par une via la routine StartIo .
Le débit d’E/S du pilote peut devenir sensiblement plus lent pendant les périodes de forte demande d’E/S, car sa routine StartIo peut devenir un goulot d’étranglement.
La routine StartIo du pilote appelle IoCallDriver avec chaque IRP à IRQL = DISPATCH_LEVEL, ce qui entraîne l’exécution de toutes les routines de répartition des pilotes de niveau inférieur à IRQL = DISPATCH_LEVEL. Cela limite l’ensemble des routines de support que les pilotes inférieurs peuvent appeler dans leurs routines de distribution. Étant donné que la plupart des enregistreurs de pilotes supposent que les routines de répartition de leurs pilotes s’exécutent sur irQL < DISPATCH_LEVEL, il est peu probable que le pilote de niveau supérieur soit interopérable avec de nombreux pilotes de niveau inférieur existants.
La routine StartIo réduit le débit global du système, car elle et les routines de répartition de tous les pilotes de niveau inférieur de sa chaîne sont exécutées à IRQL = DISPATCH_LEVEL.
Pour plus d’informations sur les IRQL auxquelles les routines de pilotes standard sont exécutées, consultez Gestion des priorités matérielles.
Aucun des pilotes de niveau supérieur fournis par le système n’a de routine StartIo , car il peut ralentir le traitement IRP pour le pilote lui-même, pour tous les pilotes au-dessus et en dessous, et pour l’ensemble du système.
La plupart des pilotes de niveau supérieur envoient simplement des IRP aux pilotes de niveau inférieur à partir de leurs routines de répartition et effectuent tout traitement propre nécessaire dans leurs routines IoCompletion.
Toutefois, les pilotes de niveau supérieur peuvent configurer des files d’attente internes pour les IRP qui demandent des types d’opérations particuliers, ou configurer des files d’attente internes pour contenir les IRP liés à un ensemble d’appareils sous-jacents hétérogènes comme le pilote de port SCSI. Pour plus d’informations, consultez Mise en file d’attente et retrait des IRP.