Partager via


Tests PnP (Device Fundamentals)

Les tests fondamentaux PnP des appareils forcent un pilote à gérer presque tous les IRP PnP ; toutefois, il existe trois domaines qui sont mis en avant spécifiquement : la suppression, le rééquilibrage et la suppression surprise. Le test PnP fournit un mécanisme permettant de tester chacun de ces éléments séparément, ou de les tester ensemble (autrement dit, en tant que test de contrainte). Ce test PnP s’effectue à l’aide d’une combinaison d’appels d’API en mode utilisateur (via l’application de test) et d’appels d’API en mode noyau (via un pilote de filtre supérieur).

Tests PNP

Les tests Plug-and-Play (PnP) exécutent différents chemins de code liés à PnP dans les composants du pilote et du mode utilisateur. Les tests PnP doivent être exécutés avec driver Verifier activé sur l’ordinateur de test. Pour plus d’informations sur l’activation du vérificateur de pilotes, consultez les propriétés du vérificateur de pilotes pour les projets de pilotes.

Essai Descriptif

Désactiver la prise en charge du test de dispositif amélioré (EDT)

Ce test désinstalle le pilote de filtre de test (msdmfilt.sys) en tant que filtre supérieur sur les appareils spécifiés à l’aide du paramètre DQ. Ce filtre de test est installé dans le cadre des tests en cours d’exécution dans cette catégorie de test

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Redémarrage de PNP (désactiver et activer) avec E/S avant et après

Ce test effectue une désactivation et activation de base de PnP et des E/S sur les appareils avec un redémarrage du système.

Binaire de test : Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

Méthode de test : PNP_DisableEnable_Reboot_With_IO_Before_And_After

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

IOPeriod

PNP (désactiver et activer) avec E/S avant et après

Ce test effectue des E/S et la désactivation/activation de base des appareils PnP.

Ce test effectue les opérations suivantes :

  1. Vérifie qu’il n’existe aucun appareil sur le système signalant les codes de problème de l’appareil.
  2. Teste les E/S sur chaque appareil du système à l’aide des plug-ins d’E/S simples WDTF. Consultez les plug-ins WDTF simples d’E/S fournis pour plus d’informations.
  3. Désactive et active chaque appareil sur le système à l’aide des interfaces d’action PNP WDTF, consultez IWDTFPNPAction2::DisableDevice et IWDTFPNPAction2::EnableDevice pour plus d’informations.
  4. Vérifie qu’il n’existe aucun appareil sur le système signalant les codes de problème de l’appareil.
  5. Teste les E/S sur chaque appareil du système à l’aide des plug-ins d’E/S simples WDTF. Pour plus d’informations, consultez les plug-ins WDTF simples d’E/S fournis .
  6. Répète les étapes 3 à 5 plusieurs fois.

Binaire de test : Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

Méthode de test : PNP_DisableEnable_With_IO_Before_And_After

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

IOPeriod

Test d'annulation et de suppression de l'appareil PNP

Ce test utilise le pilote de filtre EDT pour envoyer l'instruction IRP_MN_CANCEL_REMOVE_DEVICE aux piles de périphériques cibles.

Pour plus d’informations, consultez À propos des tests de suppression d’appareil.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPCancelRemoveDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de l'appareil d'arrêt d'annulation PNP

Ce test utilise le pilote de filtre EDT pour envoyer IRP_MN_CANCEL_STOP_DEVICE aux piles de périphériques cibles.

Pour plus d’informations, consultez À propos des tests De rééquilibrage.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPCancelStopDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF Supprimer le test d’appareil

Ce test utilise l’API SetupDi pour envoyer une demande de DIF_REMOVE pour que les programmes d’installation suppriment l’appareil.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPDIFRemoveAndRescanParentDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de désactivation et d'activation de l'appareil PNP

Ce test désactive et active les appareils cibles.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPDisableAndEnableDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Test de rééquilibrage PNP en cas d’échec du redémarrage de l’appareil

Ce test utilise le pilote de filtre EDT pour tenter d’envoyer des IRP_MN_STOP_DEVICE aux piles de périphériques cibles. Le pilote de filtre EDT échoue ensuite les demandes IRP_MN_START_DEVICE (qui suivent les demandes IRP_MN_STOP_DEVICE) pour déclencher la suppression surprise des appareils cibles.

Pour plus d’informations, consultez À propos des tests De rééquilibrage.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPTryStopDeviceAndFailRestart

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de rééquilibrage des ressources du périphérique PNP

Ce test utilise le pilote de filtre EDT pour essayer d’envoyer IRP_MN_STOP_DEVICE aux piles de dispositifs cibles. Il manipule également les besoins en ressources des appareils pour maximiser les chances que de nouvelles ressources soient allouées aux appareils.

Pour plus d’informations, consultez À propos des tests De rééquilibrage.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPTryStopDeviceRequestNewResourcesAndRestartDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de Retrait de Périphérique PNP

Ce test provoque l'envoi des commandes IRP_MN_QUERY_REMOVE_DEVICE et IRP_MN_REMOVE_DEVICE aux piles de dispositifs cibles.

Pour plus d’informations, consultez À propos des tests de suppression d’appareil.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPRemoveAndRestartDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de l'appareil PNP Stop (Rééquilibrage)

Ce test utilise le pilote de filtre EDT pour tenter d’envoyer IRP_MN_STOP_DEVICE aux piles de périphériques cibles.

Pour plus d’informations, consultez À propos des tests De rééquilibrage.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPTryStopAndRestartDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Test de Retrait Inattendu du Dispositif PNP

Ce test utilise le pilote de filtre EDT pour envoyer des IRP_MN_SURPRISE_REMOVAL aux piles d’appareils cibles.

Pour plus d’informations, consultez À propos du test de suppression surprise.

Binaire de test : Devfund_PnPDTest.dll

Méthode de test : PNPSurpriseRemoveAndRestartDevice

Paramètres : - voir Paramètres de test de base de l’appareil

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

À propos des tests de suppression d’appareil

  • Test de suppression du périphérique PNP
  • Test de suppression d’appareil PNP Cancel

Le test de suppression d’appareil englobe IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE et IRP_MN_REMOVE_DEVICE.

Le test tente d’installer son pilote de filtre supérieur sur la pile de périphériques cibles. Cette tentative entraîne une IRP de suppression de requête.

Si cette requête IRP de suppression échoue, le test redémarre l’ordinateur pour placer le pilote de filtre dans la pile de périphériques. Si la demande de suppression n’est pas bloquée, la pile de périphériques est supprimée et redémarrée avec le pilote de filtre sur la pile de périphériques.

Le test, à l’aide des API d’installation, entraîne l’envoi d’un IRP de suppression de requête à la pile d’appareils. Le pilote de filtre échoue à traiter cette demande de suppression. Par conséquent, un IRP d’annulation est envoyé. Le pilote de filtre va confirmer que l'annulation de la suppression a été effectuée avec succès.

Ensuite, l’application de test appelle le programme d’installation de classe approprié et tous les co-programmes d’installation inscrits pour désactiver ou activer et supprimer ou réenumer l’appareil (cela teste la gestion des classes et des co-programmes d’installation de DIF_PROPERTYCHANGE avec DICS_DISABLE, DICS_ENABLE et DICS_PROPCHANGE). Lors de la réception de IRP_MN_REMOVE_DEVICE, le pilote de filtre affirme que les pilotes inférieurs l’ont terminé correctement.

Chacune de ces étapes implique une demande de suppression préliminaire. Si cette demande est bloquée, l’appareil ne sera pas supprimé. Vous pouvez choisir de refuser une demande de suppression le cas échéant, par exemple lors de la diffusion de vidéos sur une caméra USB ou si l’appareil cible se trouve dans le chemin de démarrage ou de pagination. N’oubliez pas que l’échec de toutes les demandes de suppression n’est généralement pas une bonne pratique. L’échec de toutes les demandes de suppression ne garantit pas que le pilote ne recevra jamais de suppression, car un IRP de suppression sera toujours émis après une suppression surprise, ou si quelqu’un dans la pile d’appareils échoue à un IRP de démarrage.

À propos du test de suppression surprise

  • Test de retrait surprise du périphérique (PNP)

Le test De suppression surprise englobe IRP_MN_SURPRISE_REMOVAL suivi de IRP_MN_REMOVE_DEVICE.

Comme pour les tests précédents, l’application de test tente d’ajouter un filtre supérieur à la pile d’appareils cible, puis redémarre la pile. Si cette tentative ne réussit pas, le test redémarre l’ordinateur.

Lorsqu’il est déclenché par l’application de test, le pilote de filtre entraîne l’envoi d’un IRP_MN_SURPRISE_REMOVAL à la pile de périphériques, suivi d’un IRP_MN_REMOVE_DEVICE. Le pilote de filtre assurera que ces deux IRP (paquets de requêtes I/O) sont terminés avec succès par les pilotes de niveau inférieur.

Une fois le test de suppression surprise terminé, l’appareil sera désinstallé et réenumeré, ce qui supprimera également le pilote de filtre de la pile.

À propos des tests de rééquilibrage

  • Test de l'appareil PNP Stop (Rééquilibrage)
  • Test du rééquilibrage PNP Demande de nouvelles ressources pour le périphérique
  • Test d’échec de rééquilibrage et redémarrage de l’appareil PNP
  • Test du dispositif d'arrêt PNP

Comme pour le test de suppression, l’application de test tente d’ajouter un filtre supérieur à la pile d’appareils cible, puis redémarre la pile en utilisant SetupDiCallClassInstaller avec DIF_PROPERTYCHANGE. Si cette tentative n’a pas réussi (autrement dit, si un élément sur la pile de périphériques cibles a échoué dans la suppression de la requête IRP), le test redémarre l’ordinateur afin de tester le rééquilibrage.

Selon le test de rééquilibrage que vous choisissez, les événements suivants se produisent :

  1. Test d’appareil PNP Stop (Rééquilibrage) Ce test lance une procédure de rééquilibrage qui entraîne un IRP_MN_QUERY_STOP_DEVICE PnP IRP auprès du pilote de périphérique.

    Si un pilote au sein de la pile échoue cet IRP, la procédure de rééquilibrage est abandonnée. Notez que dans Windows Vista, il existe une prise en charge du rééquilibrage multiniveaux. Si un rééquilibrage est démarré sur un nœud d'appareil non-feuille, toutes les piles de dispositifs présentes dans l’arborescence des appareils avec ce nœud d'appareil en tant que racine passent également par un rééquilibrage. Et si l’une des piles des dispositifs enfants échoue lors de la requête d'arrêt, la procédure de rééquilibrage complète est abandonnée. Les pilotes ne doivent donc pas échouer à l’arrêt de la requête sans une véritable raison de le faire. Si cette défaillance se produit, le gestionnaire PnP envoie une annulation d'arrêt (IRP_MN_CANCEL_STOP) à toutes les piles d'appareils pour lesquelles la requête d'arrêt avait été envoyée.

    Si toutes les piles d’appareils impliquées ont réussi l’arrêt de la requête, le test continue avec le rééquilibrage et envoie les IRP_MN_QUERY_RESOURCE_REQUIREMENTS et IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS pour trouver les besoins en ressources des appareils.

    Après ce point, deux chemins différents sont possibles selon que l’appareil cible consomme des ressources ou non :

    • Si l’appareil ne consomme aucune ressource, le gestionnaire PnP lui-même envoie une annulation d’arrêt (IRP_MN_CANCEL_STOP_DEVICE) pour optimiser le fonctionnement.

      Si l’appareil consomme réellement des ressources, la procédure de rééquilibrage est effectuée avec les IRP_MN_STOP_DEVICE et les IRP_MN_START_DEVICE IRPs.

    Avec cette option, les ressources de l’appareil ne changent pas.

  2. Test PNP Cancel Stop Device : ce test lance une procédure de rééquilibrage, mais le pilote de filtre échoue délibérément à l’arrêt de requête IRP. L'ordre des IRPs ressemble à IRP_MN_QUERY_STOP_DEVICE (qui échoue par le pilote de filtre au démarrage, provoquant une annulation de rééquilibrage) et IRP_MN_CANCEL_STOP_DEVICE.

    Avec cette option, les ressources de l’appareil ne changent pas

  3. Test de rééquilibrage PNP pour un nouvel appareil nécessitant des ressources Ce test initie un rééquilibrage et manipule également les exigences de ressources de l’appareil pour maximiser les chances que de nouvelles ressources soient effectivement allouées à celui-ci. Cette option permet également à un appareil sans ressources d’effectuer la procédure complète de rééquilibrage :

    1. Premièrement, le rééquilibrage simple est démarré, provoquant les IRPs suivants :

      • IRP_MN_QUERY_STOP_DEVICE (en supposant que cet IRP est traité par tous les pilotes. Le test a déjà couvert le cas où cet IRP a échoué.)
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS. En réponse à cet IRP, tout en remontant, le pilote de filtre agit en fonction du fait que le périphérique consomme des ressources ou non :
        • Si l’appareil n’a aucune exigence de ressource, le filtre affecte une fausse ressource.
        • Si l’appareil a une exigence de ressource, il tente de restructurer la liste des besoins en ressources de telle sorte qu’il optimise la probabilité de modifier l’affectation actuelle. Par exemple, si un appareil a besoin de 2 octets de mémoire n’importe où entre 00 et FF et est actuellement affecté à 3A-3B, modifiez de sorte que la nouvelle exigence de ressource (par ordre de préférence) ressemble à 00-39 ou 3C-FF ou 3A-3B. De même, si la liste des conditions requises pour les ressources de l’appareil a des exigences alternatives, elle modifie leur ordre afin que l’autre exigence soit fournie plus haut dans la liste.
    2. À présent, l’appareil doit toujours effectuer la procédure de rééquilibrage.

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE (les nouvelles ressources allouées. Si des exigences fausses ont été créées, masquez les nouvelles ressources des pilotes réels.)

  4. Test de redémarrage de l'appareil suite à l'échec du rééquilibrage PNP Ce test initie un rééquilibrage, mais lorsque le pilote de filtre reçoit le signal de démarrage après le rééquilibrage, il échoue délibérément, ce qui provoque une requête IRP de retrait surprise suivie d'une requête IRP de retrait.

    Tout d’abord, il démarre la procédure de rééquilibrage et vérifie que le pilote obtient un arrêt et un démarrage en générant une exigence fictive de ressource pour un appareil qui ne consomme aucune ressource.

    • IRP_MN_QUERY_STOP_DEVICE (en supposant que cet IRP est traité par tous les pilotes. Le test a déjà couvert le cas où cet IRP a échoué.)
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS (Si la nécessité réelle en ressources est nulle, le filtre attribue une nécessité en ressources factice, afin qu'il y ait un arrêt et un démarrage.)
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE (le filtre échoue sur cette IRP lors de la montée. Cette action provoque la suppression de l’IRP surprise.)
    • IRP_MN_SURPRISE_REMOVAL
    • IRP_MN_REMOVE

    Une fois le test de rééquilibrage terminé, le périphérique sera désinstallé et réénuméré, supprimant également le pilote de filtre de la pile.

Codes d’erreur de l’appareil

Si le test fournit un message d’erreur indiquant que l’état de l’appareil n’est pas OK, vous pouvez en savoir plus sur l’état de l’appareil via device Manager. Pour obtenir un résumé des différents codes d’erreur de l’appareil, consultez Les messages d’erreur du Gestionnaire de périphériques.

Déboguer les échecs d'installation à l'aide des journaux de l'API d'installation

Les journaux de l’API d’installation (setupapi.app.log et setupapi.dev.log) peuvent contenir des informations utiles pour déboguer les échecs d’installation du pilote enregistrés par ce test. Les journaux de l’API d’installation se trouvent sous %windir%répertoire \inf\ sur le système de test.

Pour augmenter le niveau de détail et l’utilité potentielle de ces journaux, définissez la clé de Registre suivante sur 0x2000FFFF avant d’exécuter le test de réinstallation :

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel

Comment tester un pilote au moment de l’exécution à l’aide de Visual Studio

Comment sélectionner et configurer les tests de base de l’appareil

Tests de base de l’appareil

Plug-ins WDTF simple d’E/S fournis

Guide pratique pour tester un pilote au moment de l’exécution à partir d’une invite de commandes