Partager via


Désactivation d’un port NDIS

Pour désactiver les ports NDIS, un pilote miniport envoie un événement de désactivation de port Plug-and-Play (PnP) à NDIS. Une fois qu’un pilote miniport a correctement activé un port, le pilote doit le désactiver avant de pouvoir libérer le port. En outre, le pilote peut désactiver un port pour des raisons spécifiques à l’application. Un port peut être réactivé après sa désactivation, mais un port ne peut pas être réactivé s’il est libéré.

Pour envoyer un événement PnP de désactivation de port, les pilotes miniport utilisent le code d’événement NetEventPortDeactivation PnP dans l’appel à la fonction NdisMNetPnPEvent . Pour désactiver les ports, le pilote miniport doit définir les membres de la structure NET_PNP_EVENT_NOTIFICATION vers laquelle pointe le paramètre NetPnPEvent de NdisMNetPnPEvent comme suit :

PortNumber
Port source de la notification d’événement. Définissez ce membre sur zéro, car les numéros de port sont fournis dans le membre Buffer de la structure spécifiée par le membre NetPnPEvent .

NetPnPEvent
Structure NET_PNP_EVENT qui décrit l’événement de désactivation de port. Définissez les membres de cette structure comme suit :

NetEvent
Code d’événement qui décrit l’événement. Définissez ce membre sur NetEventPortDeactivation.

Tampon
Pointeur vers un tableau d’éléments NDIS_PORT_NUMBER typés. Le tableau contient les numéros de port de tous les ports que le pilote miniport désactive.

BufferLength
Nombre d’octets spécifiés dans Buffer . Définissez BufferLength sur la taille du tableau vers lequel buffer pointe. Pour obtenir le nombre d’éléments dans le tableau, divisez la valeur dans BufferLength par la taille du type de données NDIS_PORT_NUMBER.

Autres membres
Définissez les membres restants de NET_PNP_EVENT sur NULL.

Un pilote miniport peut fournir un tableau avec une liste de ports à désactiver. Toutefois, si le port par défaut d’un adaptateur miniport est la cible d’un événement NetEventPortDeactivation PnP, le port par défaut doit être le seul port spécifié dans le tableau.

Les pilotes Miniport peuvent désactiver les ports actifs à tout moment. Toutefois, avant qu’un pilote miniport ne désactive un port, il doit s’assurer qu’il n’y a pas d’indications de status en suspens ou de recevoir des indications associées à ce port. Une fois que le pilote miniport a envoyé l’événement PnP de désactivation de port, il ne doit pas lancer de status ou recevoir des indications associées aux ports désactivés.

Un pilote miniport peut également réactiver un port. Pour plus d’informations sur l’activation des ports NDIS, consultez Activation des ports NDIS.

Lorsqu’un pilote miniport désactive les ports, NDIS avertit tous les pilotes de protocole qui sont liés au pilote miniport avec l’événement NetEventPortDeactivation PnP. Cet événement PnP répertorie les ports qui sont passés à l’état alloué et n’inclut pas les ports qui sont déjà désactivés. Pour plus d’informations sur la gestion des événements de désactivation de port dans un pilote de protocole, consultez Gestion de l’événement PnP de désactivation de port.

Avant qu’un pilote miniport alloue un port NDIS, le pilote doit appeler la fonction NdisMSetMiniportAttributes pour définir les attributs d’inscription dans la structure NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES . Les pilotes Miniport peuvent contrôler l’activation du port par défaut en définissant l’indicateur d’attribut NDIS_MINIPORT_CONTROLS_DEFAULT_PORT lorsqu’ils appellent NdisMSetMiniportAttributes. Si un pilote miniport assume la responsabilité d’activer le port par défaut et que le pilote miniport a activé le port par défaut, il doit désactiver le port par défaut avant de revenir à partir de la fonction MiniportHaltEx .

Tous les ports spécifiés par le tableau d’éléments NDIS_PORT_NUMBER doivent être à l’état activé. Un pilote miniport ne doit pas tenter de désactiver un port qui a déjà été désactivé.

Si NDIS ne parvient pas à désactiver les ports du tableau de ports, aucun des ports du tableau de ports ne change d’état. Si la désactivation échoue parce que certains des ports spécifiés n’existent pas, la fonction NdisMNetPnPEvent retourne la valeur de retour NDIS_STATUS_INVALID_PORT. Si la désactivation échoue parce que certains ports ne sont pas dans l’état activé, NdisMNetPnPEvent retourne la valeur de retour NDIS_STATUS_INVALID_PORT_STATE.

Tant que l’appel à NdisMNetPnPEvent n’est pas retourné, un port n’est pas désactivé et les pilotes miniport doivent être en mesure de gérer les requêtes OID et d’envoyer des requêtes associées à ce port.

Lorsqu’un pilote miniport désactive le port par défaut, NDIS ferme toutes les liaisons entre les pilotes de protocole de superposition et l’adaptateur miniport. Si un pilote miniport tente de désactiver le port par défaut et que le port par défaut est déjà désactivé, NdisMNetPnPEvent échoue et retourne la valeur de retour NDIS_STATUS_INVALID_PORT_STATE. Si un pilote miniport tente de désactiver le port par défaut et que le port par défaut n’est pas le seul port spécifié dans le tableau d’éléments NDIS_PORT_NUMBER, NdisMNetPnPEvent échoue et retourne la valeur de retour NDIS_STATUS_INVALID_PORT. Si un pilote miniport définit le membre Buffer sur NULL ou le membre BufferLength sur zéro, NDIS échoue à l’appel NdisMNetPnPEvent et retourne la valeur de retour NDIS_STATUS_INVALID_PARAMETER.

Une fois qu’un port a été correctement désactivé, le port est dans l’état alloué. Les pilotes Miniport ne peuvent pas indiquer les données ou les status reçues pour le port dans l’état alloué.