Points à prendre en compte pour les routines StartIo
Gardez à l’esprit les points suivants lors de l’implémentation d’une routine StartIo :
Une routine StartIo doit synchroniser son accès à un appareil physique et à toutes les informations ou ressources d’état partagées que le pilote conserve dans l’extension de périphérique avec les autres routines du pilote qui accèdent au même appareil, au même emplacement de mémoire ou aux mêmes ressources.
Si la routine StartIo partage l’appareil ou l’état avec l’ISR, elle doit utiliser KeSynchronizeExecution pour appeler une routine SynchCritSection fournie par le pilote afin de programmer l’appareil ou d’accéder à l’état partagé. Pour plus d’informations, consultez Utilisation des sections critiques.
Si la routine StartIo partage l’état ou les ressources avec des routines autres que l’ISR, elle doit protéger l’état partagé ou les ressources avec un verrou de rotation exécutif initialisé par le pilote pour lequel le pilote fournit le stockage. Pour plus d’informations, consultez Verrous tournants.
Si un pilote de périphérique monolithique non WDM configure un objet contrôleur, sa routine StartIo peut utiliser l’objet contrôleur pour synchroniser des opérations via un appareil physique partagé avec des appareils (similaires) attachés.
Pour plus d’informations, consultez Controller Objects .
À moins qu’un pilote de niveau supérieur étroitement couplé présplite de grandes demandes de transfert DMA pour son pilote de périphérique sous-jacent, la routine StartIo du pilote de périphérique sous-jacent doit fractionner les demandes de transfert volumineuses en plages de transfert partiel et le pilote doit effectuer une séquence d’opérations de périphérique de transfert partiel. Chaque transfert partiel doit être dimensionné en fonction des fonctionnalités du matériel : les fonctionnalités de l’appareil du pilote ou, pour un appareil DMA subordonné, les fonctionnalités du contrôleur DMA système, selon ce qui présente des contraintes plus strictes.
Consultez Objets adaptateurs et DMA pour plus d’informations sur l’utilisation de DMA master système ou de bus.
La routine StartIo d’un pilote qui utilise DMA doit synchroniser les transferts à l’aide d’un objet adaptateur.
Une routine StartIo est exécutée sur IRQL = DISPATCH_LEVEL, ce qui limite l’ensemble des routines de support qu’elle peut appeler.
Par exemple, une routine StartIo ne peut ni accéder à ni allouer de mémoire paginable, et elle ne peut pas attendre qu’un objet de répartiteur soit défini sur l’état signalé. En revanche, une routine StartIo peut acquérir et libérer un verrou de rotation exécutif alloué par le pilote avec KeAcquireSpinLockAtDpcLevel et KeReleaseSpinLockFromDpcLevel, qui s’exécutent plus rapidement que KeAcquireSpinLock et KeReleaseSpinLock.
Pour plus d’informations, consultez Gestion des priorités matérielles et des verrous de rotation.
Si le pilote conserve des irps dans un état annulable, sa routine StartIo doit case activée si l’IRP d’entrée a déjà été annulé avant de commencer le traitement de cette demande sur son appareil. Pour plus d’informations, consultez Annulation des runtimes d’intégration.