Fonction IoConnectInterrupt (wdm.h)
La routine IoConnectInterrupt enregistre la routine InterruptService (ISR) d’un pilote de périphérique, afin qu’elle soit appelée lorsqu’un appareil s’interrompt sur un ensemble de processeurs spécifié.
Syntaxe
NTSTATUS IoConnectInterrupt(
[out] PKINTERRUPT *InterruptObject,
[in] PKSERVICE_ROUTINE ServiceRoutine,
[in, optional] PVOID ServiceContext,
[in, optional] PKSPIN_LOCK SpinLock,
[in] ULONG Vector,
[in] KIRQL Irql,
[in] KIRQL SynchronizeIrql,
[in] KINTERRUPT_MODE InterruptMode,
[in] BOOLEAN ShareVector,
[in] KAFFINITY ProcessorEnableMask,
[in] BOOLEAN FloatingSave
);
Paramètres
[out] InterruptObject
Pointeur vers l’adresse du stockage fourni par le pilote pour un pointeur vers un ensemble d’objets d’interruption. Ce pointeur doit être passé dans les appels suivants à KeSynchronizeExecution.
[in] ServiceRoutine
Pointeur vers le point d’entrée de la routine InterruptService fournie par le pilote.
[in, optional] ServiceContext
Pointeur vers le contexte déterminé par le pilote qui sera fourni à la routine InterruptService lors de son appel. La zone ServiceContext doit se trouver dans la mémoire résidente : dans l’extension d’appareil d’un objet d’appareil créé par un pilote, dans l’extension de contrôleur d’un objet contrôleur créé par le pilote ou dans un pool non paginé alloué par le pilote de périphérique. Pour plus d’informations, consultez Fournir des informations sur le contexte ISR .
[in, optional] SpinLock
Pointeur vers un verrou de rotation initialisé, pour lequel le pilote fournit le stockage, qui sera utilisé pour synchroniser l’accès aux données déterminées par le pilote partagées par d’autres routines de pilotes. Ce paramètre est obligatoire si l’ISR gère plusieurs vecteurs ou si le pilote a plusieurs ISR. Sinon, le pilote n’a pas besoin d’allouer de stockage pour un verrou de rotation d’interruption et le pointeur d’entrée est NULL.
[in] Vector
Spécifie le vecteur d’interruption transmis dans la ressource d’interruption au niveau du membre u.Interrupt.Vector de CM_PARTIAL_RESOURCE_DESCRIPTOR.
[in] Irql
Spécifie le DIRQL passé dans la ressource d’interruption au niveau du membre u.Interrupt.Level de CM_PARTIAL_RESOURCE_DESCRIPTOR.
[in] SynchronizeIrql
Spécifie le DIRQL auquel l’ISR s’exécutera. Si l’ISR gère plusieurs vecteurs d’interruption ou si le pilote a plusieurs ISR, cette valeur doit être la plus élevée des valeurs Irql passées à u.Interrupt.Level dans chaque ressource d’interruption. Sinon, les valeurs Irql et SynchronizeIrql sont identiques.
[in] InterruptMode
Spécifie si l’interruption de l’appareil est LevelSensitive ou Latched.
[in] ShareVector
Spécifie si le vecteur d’interruption est partageable.
[in] ProcessorEnableMask
Spécifie une valeur KAFFINITY représentant l’ensemble de processeurs sur lesquels les interruptions d’appareil peuvent se produire dans cette plateforme. Cette valeur est transmise dans la ressource d’interruption à l’adresse u.Interrupt.Affinity.
[in] FloatingSave
Spécifie s’il faut enregistrer la pile à virgule flottante lorsque l’appareil du pilote s’interrompt. Pour les plateformes x86 et Itanium, cette valeur doit être définie sur FALSE. Pour plus d’informations sur l’enregistrement de l’état à virgule flottante et MMX, consultez Utilisation de virgule flottante ou de MMX dans un pilote WDM.
Valeur retournée
IoConnectInterrupt peut retourner l’une des valeurs NTSTATUS suivantes :
STATUS_SUCCESS
STATUS_INVALID_PARAMETER : aucun processeur n’a été spécifié.
STATUS_INSUFFICIENT_RESOURCES : le pool non paginé n’était pas suffisant.
Remarques
Les nouveaux pilotes doivent utiliser la routine IoConnectInterruptEx , qui est plus facile à utiliser. Les pilotes pour les appareils qui prennent en charge les interruptions signalées par message (MSI) doivent utiliser IoConnectInterruptEx.
Un pilote PnP doit appeler IoConnectInterrupt dans le cadre du démarrage de l’appareil, avant de terminer la demande pnP IRP_MN_START_DEVICE .
Lorsqu’un pilote reçoit une demande de IRP_MN_START_DEVICE , il reçoit des ressources matérielles brutes et traduites dans les membres Parameters.StartDevice.AllocatedResources et Parameters.StartDevice.AllocationResourcesTranslated de la structure IO_STACK_LOCATION de l’IRP, respectivement. Pour connecter son interruption, le pilote utilise les ressources dans AllocationResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. Le pilote doit analyser le tableau de descripteurs partiels à la recherche de ressources de type CmResourceTypeInterrupt.
Si le pilote fournit le stockage pour le SpinLock, il doit appeler KeInitializeSpinLock avant de passer son verrou de rotation d’interruption à IoConnectInterrupt.
Au retour d’un appel réussi à IoConnectInterrupt, l’ISR de l’appelant peut être appelé si les interruptions sont activées sur l’appareil du pilote ou si ShareVector a été défini sur TRUE. Les pilotes ne doivent pas activer les interruptions avant le retour d’IoConnectInterrupt .
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 2000. |
Plateforme cible | Universal |
En-tête | wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Règles de conformité DDI | HwStorPortProhibitedDDIs(storport),IrqlIoPassive2(wdm), PowerIrpDDis(wdm) |