Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 gratuit 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 :
Met à jour ou initialise tout contexte que le pilote maintient dans l'extension de l'objet de l'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 divisée en transferts partiels en raison de limitations imposées par le système ou imposées par l’appareil à la taille de chaque transfert DMA. Dans ces circonstances, la routine ControllerControl est également chargée d’appeler AllocateAdapterChannel si le pilote a une routine AdapterControl .
Si le pilote utilise le PIO, sa routine ControllerControl est également chargée de fractionner les demandes de transfert, si son matériel le nécessite, en plages de transfert partielles 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 des sections critiques.
Si le pilote a une routine Cancel, sa routine ControllerControl doit également vérifier le champ Irp-Cancel> pour déterminer si l’IRP actuel doit être annulé et effectuer 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 l’état et zéro pour les informations dans le bloc d’état d’E/S 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 désemboîtez le prochain IRP si le pilote gère sa propre file d'attente.
Terminez un IRP annulé avec IoCompleteRequest et rendez le contrôle.
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 de l’IRP sur NULL. Acquérir le verrou pivot d’annulation pour cet appel si le pilote utilise la file d’attente de périphériques fournie par le gestionnaire d’E/S dans l’objet du périphérique.
Programmez le matériel de 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 IRPs pouvant être annulées, 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 effectuées, la routine qui terminera l’IRP doit appeler IoFreeController et IoStartNextPacket afin que la requête suivante puisse être traitée le plus rapidement possible.
Si la routine ControllerControl elle-même termine un IRP ou s’il peut configurer une opération, telle qu’une recherche de disque, pour un objet d’appareil cible (disque) qui peut se chevaucher avec une opération pour un autre objet d’appareil, la routine ControllerControl doit retourner DeallocateObject.