Configuration requise pour la routine ControllerControl
Comme son nom l’indique, une routine ControllerControl est associée à un objet contrôleur. Lorsque la routine ControllerControl s’exécute, le matériel représenté par l’objet contrôleur est libre et l’extension du contrôleur n’est généralement pas accessible par une autre routine de pilote, sauf si l’extension du contrôleur contient un contexte partagé avec l’ISR du pilote.
En règle générale, une routine ControllerControl effectue au moins les opérations suivantes :
Mises à jour ou initialise n’importe quel contexte que le pilote maintient dans l’extension de l’appareil de l’objet d’appareil cible et dans l’extension du contrôleur
Si le pilote utilise DMA, sa routine ControllerControl est généralement chargée de déterminer si une demande de transfert donnée doit être fractionnée en transferts partiels en raison de limitations imposées par le système ou imposées par l’appareil sur la taille de chaque transfert DMA. Dans ces circonstances, la routine ControllerControl est également responsable d’appeler AllocateAdapterChannel si le pilote a une routine AdapterControl .
Si le pilote utilise PIO, sa routine ControllerControl est également chargée de fractionner les demandes de transfert, si son matériel le requiert, en plages de transfert partiel et d’appeler MmGetSystemAddressForMdlSafe avec le MDL à Irp-MdlAddress>.
Programme son matériel pour l’opération d’E/S demandée
Si l’extension d’appareil ou de contrôleur est accessible à partir de l’ISR, la routine ControllerControl doit utiliser une routine SynchCritSection appelée en appelant KeSynchronizeExecution. Pour plus d’informations, consultez Utilisation de sections critiques.
Si le pilote a une routine Cancel, sa routine ControllerControl doit également case activée le champ Irp-Cancel> pour déterminer si l’IRP actuel doit être annulé, et effectuez l’une des opérations suivantes :
Si Irp-Cancel> a la valeur TRUE, la routine ControllerControl doit effectuer les opérations suivantes :
Définissez STATUS_CANCELLED pour État et zéro pour Informations dans le bloc d’E/S status de l’IRP.
Appelez IoFreeController pour libérer l’objet contrôleur afin que l’opération d’appareil suivante puisse être démarrée rapidement.
Appelez IoStartNextPacket ou faites la file d’attente suivante si le pilote gère sa propre file d’attente.
Effectuez l’IRP annulé avec IoCompleteRequest et le contrôle de retour.
Si Irp-Cancel> n’est pas défini sur TRUE, la routine ControllerControl doit effectuer les opérations suivantes :
Appelez IoSetCancelRoutine pour réinitialiser le point d’entrée de routine Cancel pour l’IRP sur NULL. Acquérir le verrou d’annulation de rotation pour cet appel si le pilote utilise la file d’attente d’appareil fournie par le gestionnaire d’E/S dans l’objet d’appareil.
Programmez le matériel pour l’opération d’E/S demandée, à l’aide d’une routine SynchCritSection appelée en appelant KeSynchronizeExecution. Pour plus d’informations, consultez Utilisation des sections critiques
Pour plus d’informations sur la gestion des IRP annulables, consultez Annulation des IRPs.
Pour la plupart des opérations d’E/S pilotées par interruption, à l’exception des opérations qui se chevauchent sur différents appareils attachés au contrôleur/adaptateur physique, une routine ControllerControl doit retourner KeepObject , car la routine DpcForIsr ou CustomDpc termine l’opération et l’IRP.
Dès que les opérations d’E/S pour satisfaire la demande actuelle sont terminées, la routine qui terminera l’IRP doit appeler IoFreeController et IoStartNextPacket afin que la demande suivante puisse être traitée le plus rapidement possible.
Si la routine ControllerControl effectue elle-même une IRP ou si elle peut configurer une opération, telle qu’une recherche de disque, pour un objet d’appareil cible (disque) qui peut être chevauché avec une opération pour un autre objet d’appareil, la routine ControllerControl doit renvoyer DeallocateObject.