Partager via


MINIPORT_ISR fonction de rappel (ndis.h)

NDIS appelle la fonction MiniportInterrupt lorsqu’une carte réseau ou un autre appareil qui partage l’interruption avec la carte réseau génère une interruption.

Note Vous devez déclarer cette fonction à l’aide du type MINIPORT_ISR . Pour plus d’informations, consultez la section Exemples suivante.
 

Syntaxe

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Paramètres

[in] MiniportInterruptContext

Handle d’un bloc d’informations de contexte d’interruption. Le pilote miniport a fourni cette poignée dans le paramètre MiniportInterruptContext que le pilote miniport a transmis au Fonction NdisMRegisterInterruptEx .

[out] QueueDefaultInterruptDpc

Pointeur vers une variable BOOLEAN que le pilote miniport définit avant qu’il ne retourne à partir de cet appel. Un pilote miniport définit cette valeur sur TRUE pour indiquer que le pilote nécessite un DPC sur le processeur par défaut (actuel). Si cette valeur est définie sur TRUE, NDIS ignore la valeur du paramètre TargetProcessors . S’il est défini sur FALSE, NDIS utilise la valeur du paramètre TargetProcessors pour planifier des contrôleurs de données. Si QueueDefaultInterruptDpc a la valeur TRUE, NDIS planifie un DPC quelle que soit la valeur de retour de MiniportInterrupt.

[out] TargetProcessors

Masque de bits qui indique les processeurs cibles pour lesquels NDIS doit planifier un DPC. Ce masque de bits représente les 32 premiers processeurs du groupe de processeurs 0. Chaque bit dans le masque de bits identifie un processeur. Si l’appelant définit le bit 0, NDIS planifie un DPC pour le processeur 0. Si l’appelant définit le bit 1, NDIS planifie un DPC pour le processeur 1, et ainsi de suite. Si QueueDefaultInterruptDpc a la valeur FALSE et Que TargetProcessors a la valeur zéro, NDIS ne planifie pas de PDC. Dans le cas contraire, NDIS planifie les DPC, quelle que soit la valeur de retour de MiniportInterrupt.

Note Les pilotes NDIS 6.20 et versions ultérieures ne doivent pas utiliser ce paramètre pour planifier des DPC. Au lieu de cela, ils doivent définir ce paramètre sur zéro et utiliser la fonction NdisMQueueDpcEx pour planifier des PDC.
 

Valeur retournée

MiniportInterrupt retourne l’une des valeurs suivantes :

Code de retour Description
VRAI

MiniportInterrupt a déterminé que la carte réseau sous-jacente a généré l’interruption.

FAUX

MiniportInterrupt a déterminé que la carte réseau sous-jacente n’avait pas généré l’interruption.

 
Note NDIS met en file d’attente les DCP en fonction des valeurs spécifiées dans les paramètres QueueDefaultInterruptDpc et TargetProcessors , quelle que soit la valeur retournée par MiniportInterrupt . Toutefois, MiniportInterrupt doit toujours retourner la valeur correcte.
 

Remarques

Les pilotes Miniport qui enregistrent une interruption avec la fonction NdisMRegisterInterruptEx doivent fournir une fonction MiniportInterrupt .

Un pilote miniport doit faire le moins de travail possible dans sa fonction MiniportInterrupt . Il doit différer les opérations d’E/S pour les interruptions générées par la carte réseau vers la fonction MiniportInterruptDPC .

Lorsqu’une interruption se produit sur la ligne d’interruption d’une carte réseau, NDIS appelle la fonction MiniportInterrupt du pilote miniport.

Toutes les cartes réseau peuvent partager des interruptions basées sur des lignes avec d’autres appareils sur le bus d’E/S. Si la carte réseau n’a pas généré l’interruption, MiniportInterrupt doit immédiatement retourner FALSE afin que le système puisse appeler le pilote de l’appareil qui a généré l’interruption. Si QueueDefaultInterruptDpc a la valeur FALSE et que le paramètre TargetProcessors a la valeur zéro, NDIS ne planifie aucun contrôleur de données. Dans le cas contraire, NDIS planifie les DPC, quelle que soit la valeur de tour deMiniportInterruptde MiniportInterrupt.

Si l’interruption concerne la carte réseau, MiniportInterrupt ignore l’interruption sur la carte réseau, enregistre l’état qu’elle doit sur l’interruption et reporte autant que possible le traitement des E/S à la fonction MiniportInterruptDPC .

Si la carte réseau sous-jacente a généré l’interruption spécifiée et que le pilote miniport demande des appels de procédure différée (DPC), le pilote miniport doit désactiver toutes les interruptions supplémentaires de la carte réseau et réactiver les interruptions une fois que tous les contrôleurs DPC sont terminés.

Le pilote miniport doit définir QueueDefaultInterruptDpc sur TRUE pour planifier un DPC uniquement pour le processeur par défaut. Le pilote peut effectuer cette opération, par exemple si :

  • La carte réseau a généré l’interruption pour signaler l’achèvement d’une opération d’envoi ou toute autre requête qui ne s’exécute pas sur d’autres processeurs.
  • La carte réseau a généré l’interruption pour signaler les données reçues et le pilote miniport ne peut pas traiter les paquets reçus dans des PDC distincts.
  • L’interruption indique les paquets reçus et le pilote miniport peut traiter les paquets reçus dans des DPC distincts, mais la mise à l’échelle côté réception (RSS) n’est pas activée pour le pilote miniport. Pour plus d'informations, consultez la rubrique OID_GEN_RECEIVE_SCALE_CAPABILITIES et OID_GEN_RECEIVE_SCALE_PARAMETERS.
Si un pilote miniport traite les paquets reçus dans des PDC distincts, le pilote définit le paramètre QueueDefaultInterruptDpc surFALSE. Le pilote miniport doit définir le bit TargetProcessors pour le processeur associé à chaque file d’attente de réception sans erreur. NDIS planifie un DPC sur chacun des processeurs indiqués.
Note NDIS met en file d’attente les DCP en fonction des valeurs spécifiées dans les paramètres QueueDefaultInterruptDpc et TargetProcessors , quelle que soit la valeur retournée par MiniportInterrupt . Toutefois, MiniportInterrupt doit toujours retourner la valeur correcte.
 
Si MiniportInterrupt partage des ressources, telles que des registres de carte réseau ou des variables d’état, avec une autre fonction MiniportXxx qui s’exécute à une valeur IRQL inférieure, cette fonction MiniportXxx doit appeler le Fonction NdisMSynchronizeWithInterruptEx . Cela garantit que la fonction MiniportSynchronizeInterrupt du pilote accède aux ressources partagées de manière synchronisée et sécurisée pour plusieurs processeurs.

Un pilote miniport peut appeler le Fonction NdisMDeregisterInterruptEx à partir de sa fonction MiniportInitializeEx ou MiniportHaltEx pour libérer les ressources qu’elle a allouées avec NdisMRegisterInterruptEx. Une fois NdisMDeregisterInterruptEx retourné, NDIS n’appelle pas la fonction MiniportInterrupt ou MiniportInterruptDPC d’un pilote miniport.

NDIS appelle MiniportInterrupt à la DIRQL de l’interruption enregistrée par le pilote miniport lors d’un appel précédent à NdisMRegisterInterruptEx. Par conséquent, MiniportInterrupt doit appeler le sous-ensemble des fonctions NDIS, telles que les fonctions NdisRawXxx ou NdisRead/WriteRegisterXxx , qui peuvent être appelées en toute sécurité à n’importe quel IRQL.

Exemples

Pour définir une fonction MiniportInterrupt , vous devez d’abord fournir une déclaration de fonction qui identifie le type de fonction que vous définissez. Windows fournit un ensemble de types de fonctions pour les pilotes. La déclaration d’une fonction à l’aide des types de fonction permet à l’analyse du code pour les pilotes, le vérificateur de pilotes statique (SDV) et d’autres outils de vérification de trouver les erreurs, et il s’agit d’une exigence pour l’écriture de pilotes pour le système d’exploitation Windows.

Par exemple, pour définir une fonction MiniportInterrupt nommée « MyInterrupt », utilisez le type MINIPORT_ISR comme indiqué dans cet exemple de code :

MINIPORT_ISR MyInterrupt;

Ensuite, implémentez votre fonction comme suit :

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

Le type de fonction MINIPORT_ISR est défini dans le fichier d’en-tête Ndis.h. Pour identifier plus précisément les erreurs lors de l’exécution des 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 MINIPORT_ISR dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur la configuration requise pour les déclarations de fonction, consultez Déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes NDIS.

Pour plus d’informations sur Use_decl_annotations, consultez Annotating Function Behavior.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Pris en charge dans NDIS 6.0 et versions ultérieures.
Plateforme cible Windows
En-tête ndis.h (inclure Ndis.h)
IRQL Voir la section Remarques

Voir aussi

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)