Objets de synchronisation d’interruption

Le pilote système PortCls implémente l’interface IInterruptSync au profit des pilotes miniports. IInterruptSync représente un objet de synchronisation d’interruption qui synchronise l’exécution d’une liste de routines de service d’interruption (ISR) avec des routines sans interruption.

Les objets de synchronisation d’interruption fournissent deux fonctionnalités clés :

  • Exécution d’une liste d’ISR en réponse à une interruption. L’objet de synchronisation est connecté à une source d’interruption. Chaque fois que l’interruption se produit, l’objet de synchronisation exécute les ISR dans un ordre spécifié en fonction du mode sélectionné. (Voir la description suivante des trois modes.)

  • Exécution de routines qui ne sont pas des ISR. Ces routines sans interruption ne sont pas connectées à l’interruption de l’objet de synchronisation. Au lieu de cela, une routine sans interruption s’exécute au moment de l’appelant de son choix. Toutefois, l’objet de synchronisation exécute la routine sans interruption de manière synchrone avec la liste des ISR de l’objet. En d’autres termes, la routine sans interruption s’exécute jusqu’à ce que l’un des ISR de la liste de l’objet de synchronisation commence à s’exécuter, et inversement.

Un objet de synchronisation d’interruption est flexible pour traiter plusieurs ISR. Les ISR résident dans une liste liée que l’objet de synchronisation traverse au moment de l’interruption. Lorsqu’un pilote miniport enregistre un ISR avec un objet de synchronisation, il spécifie si l’ISR doit être ajouté au début ou à la fin de cette liste.

Un pilote miniport appelle la fonction PcNewInterruptSync pour créer un objet de synchronisation d’interruption. Pendant cet appel, le pilote spécifie la façon dont l’objet doit parcourir sa liste d’ISR au moment de l’interruption. L’appel prend en charge les trois options spécifiées par les constantes d’énumération INTERRUPTSYNCMODE dans le tableau suivant.

Constant Signification

InterruptSyncModeNormal

Appelez chaque ISR de la liste jusqu’à ce que l’un d’eux retourne STATUS_SUCCESS.

InterruptSyncModeAll

Appelez chaque ISR de la liste une seule fois, quels que soient les codes de retour des ISR précédents.

InterruptSyncModeRepeat

Parcourez la liste entière des isrs jusqu’à ce qu’un voyage dans la liste se produise dans lequel aucun ISR dans la liste ne retourne STATUS_SUCCESS.

En mode InterruptSyncModeNormal , l’objet de synchronisation appelle chaque ISR de la liste jusqu’à ce que l’un d’eux retourne STATUS_SUCCESS. Les ISR de la liste qui suivent cet ISR ne sont pas appelés. Ce mode émule la façon dont le système d’exploitation gère normalement les isrs. Si aucun des ISR ne retourne STATUS_SUCCESS, le comportement est identique à Celui d’InterruptSyncModeAll.

En mode InterruptSyncModeAll , chaque ISR de la liste est appelé exactement une fois, quels que soient les codes de retour des ISR précédents. Cela est destiné au matériel plus primitif où la source de l’interruption n’est pas déterministe, bien qu’elle puisse également être utile dans d’autres situations. Par exemple, deux sources d’interruption peuvent être étroitement synchronisées sur chaque interruption, quelle que soit la source d’une interruption particulière.

En mode InterruptSyncModeRepeat , l’objet de synchronisation traverse à plusieurs reprises l’ensemble de la liste des isrs jusqu’à ce qu’un voyage dans la liste ne se produise dans lequel aucune routine de la liste ne retourne STATUS_SUCCESS. Ce mode est approprié pour les situations dans lesquelles les interruptions provenant de plusieurs sources peuvent se déclencher sur la même ligne d’interruption en même temps, ou où une deuxième interruption peut se déclencher pendant le traitement ISR. Chaque source d’interruption doit être en mesure de déterminer si elle nécessite un traitement. Le système cesse de répondre si un ISR qui retourne toujours STATUS_SUCCESS est inscrit avec un objet de synchronisation dans ce mode.

Dans l’un de ces modes, l’objet de synchronisation reconnaît l’interruption du système d’exploitation si l’un des ISR inscrits retourne STATUS_SUCCESS. Dans les trois modes, si toutes les sources d’interruption indiquent qu’elles n’ont pas correctement géré l’interruption, l’objet de synchronisation retourne un code de résultat infructueux au système d’exploitation.

L’interface IInterruptSync prend en charge les méthodes suivantes :

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D isconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine