Partager via


AddDevice Routines dans les pilotes de fonction ou de filtre

Une routine AddDevice dans un pilote de fonction ou de filtre doit effectuer les étapes suivantes :

  1. Appelez IoCreateDevice pour créer un objet d’appareil fonctionnel ou de filtre (FDO ou filtre DO) pour l’appareil en cours d’ajout.

    Ne spécifiez pas deviceName pour l’objet d’appareil, car cela contourne la sécurité du gestionnaire PnP. Si un composant en mode utilisateur a besoin d’un lien symbolique vers l’appareil, inscrivez une interface d’appareil (voir l’étape suivante ci-dessous). Si un composant en mode noyau a besoin d’un nom de périphérique hérité, le pilote doit nommer l’objet de périphérique, mais le nommage n’est pas recommandé.

    Incluez FILE_DEVICE_SECURE_OPEN dans le paramètre DeviceCharacteristics . Cette caractéristique indique au gestionnaire d’E/S d’effectuer des vérifications de sécurité sur l’objet d’appareil pour toutes les demandes ouvertes, y compris les ouvertures relatives et les ouvertures de nom de fichier de fin.

  2. [facultatif] Créez un ou plusieurs liens symboliques vers l’appareil.

    Appelez IoRegisterDeviceInterface pour inscrire les fonctionnalités de l’appareil et créer un lien symbolique que les applications ou les composants système peuvent utiliser pour ouvrir l’appareil. Le pilote doit activer l’interface en appelant IoSetDeviceInterfaceState lorsqu’il gère la requête IRP_MN_START_DEVICE . Pour plus d’informations, consultez Classes d’interface d’appareil.

  3. Stockez le pointeur vers l’AOP de l’appareil dans l’extension de l’appareil.

    Le gestionnaire PnP fournit un pointeur vers l’AOP en tant que paramètre PhysicalDeviceObject vers AddDevice. Les pilotes utilisent le pointeur PDO dans les appels à des routines telles que IoGetDeviceProperty.

  4. Définissez des indicateurs dans l’extension d’appareil pour suivre certains états PnP de l’appareil, tels que l’appareil suspendu, supprimé et supprimé par surprise.

    Par exemple, définissez un indicateur pour indiquer que les irps entrants doivent être maintenus pendant que l’appareil est en pause. Créez une file d’attente pour conserver les IRP, si le pilote ne dispose pas déjà d’un mécanisme de mise en file d’attente des IRP. Pour plus d’informations, voir Mise en file d’attente et retrait de la file d’attente .

    Allouez également une structure IO_REMOVE_LOCK dans l’extension d’appareil et appelez IoInitializeRemoveLock pour initialiser cette structure. Pour plus d’informations, consultez Utilisation de supprimer des verrous.

  5. Définissez le DO_BUFFERED_IO ou DO_DIRECT_IO bit d’indicateur dans l’objet d’appareil pour spécifier le type de mise en mémoire tampon que le gestionnaire d’E/S doit utiliser pour les demandes d’E/S envoyées à la pile d’appareils. Pilotes de niveau supérieur OU ce membre avec la même valeur que le pilote inférieur suivant dans la pile, sauf éventuellement pour les pilotes de niveau supérieur. Pour plus d’informations, consultez Initialisation d’un objet Device.

  6. Définissez l’indicateur DO_POWER_INRUSH ou DO_POWER_PAGABLE pour la gestion de l’alimentation, si nécessaire. Les pilotes paginables doivent définir l’indicateur DO_POWER_PAGABLE. Les indicateurs d’objet de périphérique sont généralement définis par le pilote de bus lorsqu’il crée l’AOP pour l’appareil. Toutefois, les pilotes de niveau supérieur peuvent parfois avoir besoin de modifier les valeurs de ces indicateurs dans leurs routines AddDevice lorsqu’ils créent le FDO ou le filtre DO. Pour plus d’informations, consultez Définition des indicateurs d’objet d’appareil pour la gestion de l’alimentation.

  7. Créez et/ou initialisez d’autres ressources logicielles que le pilote utilise pour gérer cet appareil, telles que des événements, des verrous de rotation ou d’autres objets. (Les ressources matérielles, telles que les ports d’E/S, sont configurées ultérieurement, en réponse à une demande de IRP_MN_START_DEVICE .)

    Étant donné qu’une routine AddDevice s’exécute dans un contexte de thread système à l’emplacement IRQL = PASSIVE_LEVEL, toute mémoire allouée avec ExAllocatePoolWithTag pour une utilisation exclusivement pendant l’initialisation peut provenir d’un pool paginé, tant que le pilote ne contrôle pas l’appareil qui contient le fichier de page système. Une telle allocation de mémoire doit être libérée avec ExFreePool avant que AddDevice retourne le contrôle.

  8. Attachez l’objet d’appareil à la pile d’appareils (IoAttachDeviceToDeviceStack).

    Spécifiez un pointeur vers l’AOP de l’appareil dans le paramètre TargetDevice .

    Stockez le pointeur retourné par IoAttachDeviceToDeviceStack. Ce pointeur, qui pointe vers l’objet de périphérique du pilote inférieur suivant pour l’appareil, est un paramètre obligatoire pour IoCallDriver et PoCallDriver lors du passage des IRP dans la pile des appareils.

  9. Effacez l’indicateur DO_DEVICE_INITIALIZING dans le FDO ou le filtre DO avec une instruction semblable à la suivante :

    FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
  10. Préparez-vous à gérer les runtimes d’intégration PnP pour l’appareil (par exemple , IRP_MN_QUERY_RESOURCE_REQUIREMENTS et IRP_MN_START_DEVICE).

Un pilote ne doit pas commencer à contrôler l’appareil tant qu’il n’a pas reçu un IRP_MN_START_DEVICE contenant la liste des ressources matérielles affectées à l’appareil par le gestionnaire PnP.