Partager via


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)

Voir aussi

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution