Fonction IoConnectInterrupt (wdm.h)
La routine IoConnectInterrupt inscrit la routine de service d’interruption d’un pilote de périphérique routine (ISR), afin qu’elle soit appelée lorsqu’un appareil interrompt l’un des 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 lorsqu’elle est appelée. La zone ServiceContext doit être en mémoire résidente : dans l’extension de périphérique d’un objet de périphérique créé par le pilote, dans l’extension du contrôleur d’un objet de contrôleur créé par un pilote ou dans un pool non paginé alloué par le pilote de périphérique. Consultez Fournir des informations de contexte ISR pour plus d’informations.
[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 requis 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 membre u.Interrupt.Vector de CM_PARTIAL_RESOURCE_DESCRIPTOR.
[in] Irql
Spécifie le DIRQL passé dans la ressource d’interruption au 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 entchée .
[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 passée dans la ressource d’interruption à u.Interrupt.Affinity .
[in] FloatingSave
Spécifie s’il faut enregistrer la pile à virgule flottante lorsque l’appareil du pilote est interrompu. 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 MMX dans un pilote WDM.
Valeur de retour
IoConnectInterrupt peut retourner l’une des valeurs NTSTATUS suivantes :
STATUS_SUCCESS
STATUS_INVALID_PARAMETER: aucun processeur n’a été spécifié.
STATUS_INSUFFICIENT_RESOURCES: il n’y avait pas assez de pool non paginé.
Remarques
Les nouveaux pilotes doivent utiliser la routine IoConnectInterruptEx, ce 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 de IRP_MN_START_DEVICE PnP.
Lorsqu’un pilote reçoit une demande de IRP_MN_START_DEVICE, le pilote reçoit des ressources matérielles brutes et traduites dans les Parameters.StartDevice.AllocatedResources et Parameters.StartDevice.AllocatedResourcesTranslated membres de la structure IO_STACK_LOCATION IRP, respectivement. Pour connecter son interruption, le pilote utilise les ressources à AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. Le pilote doit analyser le tableau de descripteurs partiels pour rechercher les 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.
Lors du retour d’un appel réussi à IoConnectInterrupt, l’ISR de l’appelant peut être appelé si des 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 tant qu’après IoConnectInterrupt retourne.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Disponible à partir de Windows 2000. |
plateforme cible | Universel |
d’en-tête | wdm.h (include 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) |