Partager via


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)

Voir aussi

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution