Rendre un ISR actif ou inactif

À compter de Windows 8, un pilote peut appeler la routine IoReportInterruptActive ou IoReportInterruptInactive pour rendre une routine de service d’interruption inscrite (ISR) active ou inactive.

Pour inscrire un ISR et connecter l’ISR à une interruption ou à un ensemble d’interruptions, le pilote appelle la routine IoConnectInterruptEx . Une fois l’ISR inscrit, le pilote peut utiliser IoReportInterruptActive et IoReportInterruptInactive pour effectuer des opérations de connexion et de déconnexion légères (ou « réversibles ») qui ne modifient pas l’inscription de l’ISR. IoReportInterruptInactive désactive les appels à l’ISR en déconnectant réversiblement les interruptions ou interruptions associées. IoReportInterruptActive connecte automatiquement ces interruptions pour activer les appels à l’ISR.

Par exemple, un pilote peut appeler IoReportInterruptInactive pour déconnecter de manière réversible un ensemble d’interruptions avant qu’un appareil ne quitte l’état d’alimentation D0 et appeler IoReportInterruptActive pour connecter de manière réversible ces interruptions une fois que l’appareil entre à nouveau D0. En principe, un pilote peut appeler IoDisconnectInterruptEx avant que l’appareil quitte D0 et appeler IoConnectInterruptEx une fois que l’appareil entre à nouveau D0. Toutefois, les appels IoReportInterruptXxx sont plus rapides que les appels IoConnectInterruptEx et IoDisconnectInterruptEx . Contrairement aux appels IoConnectInterruptEx et IoDisconnectInterruptEx , qui peuvent échouer pour diverses raisons (par exemple, des ressources système insuffisantes), IoReportInterruptXxx appelle rarement, voire jamais. En outre, les routines IoReportInterruptXxx peuvent être appelées à l’adresse IRQL <= DISPATCH_LEVEL, tandis qu’IoConnectInterruptEx et IoDisconnectInterruptEx ne peuvent être appelées qu’à PASSIVE_LEVEL.

Par défaut, l’ISR est actif (et les appels à l’ISR sont activés) après qu’IoConnectInterruptEx a correctement inscrit l’ISR.

Les appels à IoReportInterruptInactive et IoReportInterruptActive sont facultatifs. Si un pilote n’appelle jamais ces routines, l’ISR inscrit reste actif jusqu’à ce que le pilote appelle la routine IoDisconnectInterruptEx pour désinscrire l’ISR.

Le pilote doit configurer l’appareil pour émettre des interruptions uniquement lorsque l’ISR de ces interruptions est actif. Le fait d’empêcher un appareil d’émettre des interruptions lorsque l’ISR est inactif peut entraîner une instabilité du système. Par exemple, si un appareil partage une ligne d’interruption déclenchée par un niveau avec d’autres appareils et que l’appareil émet des demandes d’interruption lorsque l’ISR est inactif, les ISR des autres appareils sur la ligne ne reconnaissent pas l’interruption et l’interruption continue de se déclencher. Avant d’appeler IoReportInterruptInactive, le pilote doit configurer l’appareil pour arrêter d’émettre des interruptions. Après avoir appelé IoReportInterruptActive, le pilote doit configurer l’appareil pour commencer à émettre des interruptions.

Pour annuler l’inscription d’un ISR, un pilote peut appeler IoDisconnectInterruptEx , que l’ISR soit actuellement actif ou inactif.

Un appel IoReportInterruptActive qui se produit lorsque l’ISR est déjà actif n’a aucun effet, mais n’est pas traité comme une erreur. De même, un appel IoReportInterruptInactive qui se produit lorsque l’ISR est déjà inactif n’a aucun effet, mais n’est pas traité comme une erreur.