Partager via


Initialisation d’un pilote intermédiaire

Un pilote intermédiaire NDIS inscrit ses fonctions MiniportXxx et ses fonctions ProtocolXxx dans le contexte de sa routine DriverEntry . Pour inscrire ses fonctions MiniportXxx , un pilote intermédiaire doit appeler la fonction NdisMRegisterMiniportDriver avec l’indicateur NDIS_INTERMEDIATE_DRIVER défini. Cet indicateur se trouve dans la structure NDIS_MINIPORT_DRIVER_CHARACTERISTICS que le pilote transmet à MiniportDriverCharacteristics. Pour inscrire ses fonctions ProtocolXxx , un pilote intermédiaire doit appeler la fonction NdisRegisterProtocolDriver .

DriverEntry retourne STATUS_SUCCESS, ou son équivalent NDIS_STATUS_SUCCESS, si le pilote inscrit en tant que pilote intermédiaire NDIS a réussi. Si DriverEntry échoue à l’initialisation en propageant une erreur status retournée par une fonction NdisXxx ou par une routine de prise en charge en mode noyau, le pilote ne reste pas chargé. DriverEntry doit s’exécuter de manière synchrone ; autrement dit, il ne peut pas retourner STATUS_PENDING ou son équivalent NDIS_STATUS_PENDING.

Pour inscrire le pilote intermédiaire auprès de NDIS, la routine DriverEntry doit au minimum :

  • Appelez la fonction NdisMRegisterMiniportDriver avec l’indicateur NDIS_INTERMEDIATE_DRIVER défini pour inscrire les fonctions MiniportXxx du pilote.
  • Appelez la fonction NdisRegisterProtocolDriver pour inscrire les fonctions ProtocolXxx du pilote si le pilote se lie par la suite à un pilote NDIS sous-jacent.
  • Appelez la fonction NdisIMAssociateMiniport pour informer NDIS de l’association entre le bord supérieur du miniport du pilote et le bord inférieur du protocole.

Si une erreur se produit dans DriverEntry après le retour de NdisMRegisterMiniportDriver , le pilote doit appeler la fonction NdisMDeregisterMiniportDriver avant le retour de DriverEntry . Si DriverEntry réussit, le pilote doit appeler NdisMDeregisterMiniportDriver à partir de sa fonction MiniportDriverUnload .

Les pilotes intermédiaires partagent la plupart des exigences DriverEntry des pilotes de protocole et des pilotes miniports.

L’initialisation du miniport virtuel d’un pilote intermédiaire se produit lorsque le pilote appelle la fonction NdisIMInitializeDeviceInstanceEx à partir de sa fonction ProtocolBindAdapterEx .

NDIS appelle la fonction ProtocolBindAdapterEx une fois que tous les pilotes miniports sous-jacents ont été initialisés.

En effet, la fonction DriverEntry d’un pilote intermédiaire NDIS peut ignorer le pointeur RegistryPath après l’avoir passé à NdisMRegisterMiniportDriver. Un tel pilote peut également ignorer le pointeur DriverObject après l’avoir passé à NdisMRegisterMiniportDriver. Toutefois, le pilote doit enregistrer la valeur de handle du pilote miniport retournée par NdisMRegisterMiniportDriverDriver SurNdisMiniportDriverHandle et la valeur de handle de protocole retournée par NdisRegisterProtocolDriver sur NdisProtocolHandle pour les appels ultérieurs aux fonctions NdisXxx . La fonction ProtocolBindAdapterEx du pilote intermédiaire lie le pilote à chaque pilote miniport sous-jacent avant que sa fonction MiniportInitializeEx soit appelée pour initialiser la miniport virtuelle du pilote intermédiaire. Les pilotes de protocole de niveau supérieur se lient ensuite au miniport virtuel qu’il crée. Cette stratégie permet à un pilote intermédiaire NDIS d’allouer des ressources lors de la création du miniport virtuel en fonction des fonctionnalités du pilote miniport sous-jacent auquel il est lié.