Notes
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.
Le InterruptService routine (ISR) traite rapidement une interruption d’appareil et planifie le traitement post-interruption des données reçues, si nécessaire.
Syntaxe
KSERVICE_ROUTINE KserviceRoutine;
BOOLEAN KserviceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext
)
{...}
Paramètres
[in] Interrupt
Pointeur fourni par l’appelant vers la structure KINTERRUPT pour l’interruption.
[in] ServiceContext
Pointeur fourni par l’appelant vers les informations de contexte, spécifié dans un appel précédent à IoConnectInterrupt ou IoConnectInterruptEx.
Valeur de retour
Si la routine détermine que l’interruption ne provient pas de l’un des appareils du pilote, elle doit retourner FAUX. Sinon, la routine doit traiter l’interruption et retourner TRUE.
Remarques
Pour inscrire un ISR pour un vecteur d’interruption et une affinité de processeur spécifique, un pilote doit appeler IoConnectInterrupt ou IoConnectInterruptEx.
L'InterruptService routine (ISR) d’un pilote s’exécute dans un contexte d’interruption, dans un contexte d’interruption affecté par le système, comme spécifié par le paramètre SynchronizeIrql pour IoConnectInterrupt. (D’autres appareils, avec des valeurs DIRQL supérieures, peuvent interrompre l’ISR.)
Avant que le système appelle un ISR, il acquiert le verrou de rotation de l’interruption (le paramètre SpinLock à IoConnectInterrupt), de sorte que l’ISR ne peut pas s’exécuter simultanément sur un autre processeur. Une fois que l’ISR est retourné, le système libère le verrou de rotation.
Un ISR doit d’abord déterminer si l’interruption provient de l’un des appareils du pilote, en examinant les informations de contexte fournies par Context. Si l’interruption ne provient pas de l’un des appareils du pilote, la routine doit immédiatement retourner FAUX afin que le gestionnaire d’E/S puisse appeler d’autres pilotes qui ont inscrit des ISR pour le même processeur et le même vecteur d’interruption.
Pour plus d’informations sur l’implémentation des ISR, consultez routines de service d’interruption.
Exemples
Pour définir une routine de rappel InterruptService, vous devez d’abord fournir une déclaration de fonction qui identifie le type de routine de rappel que vous définissez. Windows fournit un ensemble de types de fonctions de rappel pour les pilotes. La déclaration d’une fonction à l’aide des types de fonctions de rappel permet d'Analyse du code pour les pilotes, static Driver Verifier (SDV) et d’autres outils de vérification recherchent des erreurs, et il est nécessaire d’écrire des pilotes pour le système d’exploitation Windows.
Par exemple, pour définir une routine de rappel InterruptService nommée MyInterruptService
, utilisez le type KSERVICE_ROUTINE comme indiqué dans cet exemple de code :
KSERVICE_ROUTINE MyInterruptService;
Ensuite, implémentez votre routine de rappel comme suit :
_Use_decl_annotations_
BOOLEAN
MyInterruptService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext
)
{
// Function body
}
Le type de fonction KSERVICE_ROUTINE est défini dans le fichier d’en-tête Wdm.h. Pour identifier plus précisément les erreurs lorsque vous exécutez les outils d’analyse du code, veillez à ajouter l’annotation _Use_decl_annotations_
à votre définition de fonction. L’annotation _Use_decl_annotations_
garantit que les annotations appliquées au type de fonction KSERVICE_ROUTINE dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur les exigences relatives aux déclarations de fonction, consultez déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes WDM. Pour plus d’informations sur _Use_decl_annotations_
, consultez annoter le comportement de la fonction.
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Bureau |
d’en-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Appelé à DIRQL (voir la section Remarques). |