Freigeben über


PnP-Tests (Gerätegrundlagen)

Die Gerätegrundlagen-PnP-Tests zwingen einen Treiber, fast alle PnP-IRPs zu verarbeiten. es gibt jedoch drei Bereiche, die besonders hervorgehoben werden: Entfernung, Neuausgleich und Überraschungsentfernung. Der PnP-Test stellt einen Mechanismus bereit, um jede einzelne dieser Tests zu testen oder sie alle zusammen zu testen (d. a. als Belastungstest). Dieser PnP-Test wird durch die Verwendung einer Kombination aus API-Aufrufen im Benutzermodus (über die Testanwendung) und Kernelmodus-API-Aufrufen (über einen Treiber mit oberem Filter) durchgeführt.

PNP-Tests

Die Plug & Play -Tests (PnP) führen verschiedene PnP-bezogene Codepfade in den Treiber- und Benutzermoduskomponenten aus. Die PnP-Tests sollten mit aktivierter Treiberüberprüfung auf dem Testcomputer ausgeführt werden. Informationen zum Aktivieren der Treiberüberprüfung finden Sie unter Driver Verifier-Eigenschaften für Treiberprojekte.

Testen Beschreibung

Deaktivieren der Unterstützung für erweiterte Gerätetests (EDT)

Dieser Test deinstalliert den Testfiltertreiber (msdmfilt.sys) als oberen Filter auf Geräten, die mit dem DQ-Parameter angegeben wurden. Dieser Testfilter wird als Teil der Testausführung in dieser Testkategorie installiert

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP-Neustart (Deaktivieren und Aktivieren) mit E/A vor und nach

Dieser Test führt grundlegende PnP-Deaktivierung/Aktivierung und E/A auf Geräten mit einem Systemneustart durch.

Binärdatei testen: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

Testmethode: PNP_DisableEnable_Reboot_With_IO_Before_And_After

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

IOPeriod

PNP (Deaktivieren und Aktivieren) mit E/A vor und nach

Dieser Test führt E/A und grundlegendeS-PnP-Deaktivierung/Aktivierung auf Geräten durch.

Dieser Test führt Folgendes aus:

  1. Es wird überprüft, dass im System keine Geräte vorhanden sind, die Geräteproblemcodes melden.
  2. E/A wird auf jedem Gerät im System mithilfe von einfachen WDTF-E/A-Plug-Ins getestet. Weitere Informationen finden Sie unter Bereitgestellte einfache WDTF-E/A-Plug-Ins.
  3. Deaktiviert und aktiviert jedes Gerät im System mithilfe von WDTF PnP-Aktionsschnittstellen. Weitere Informationen finden Sie unter IWDTFPNPAction2::D isableDevice und IWDTFPNPAction2::EnableDevice-Methoden .
  4. Es wird überprüft, dass im System keine Geräte vorhanden sind, die Geräteproblemcodes melden.
  5. E/A wird auf jedem Gerät im System mithilfe von einfachen WDTF-E/A-Plug-Ins getestet. Weitere Informationen finden Sie unter Bereitgestellte WDTF Simple I/O-Plug-Ins.
  6. Wiederholt die Schritte 3-5 mehrmals.

Binärdatei testen: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

Testmethode: PNP_DisableEnable_With_IO_Before_And_After

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

IOPeriod

PNP Abbrechen Entfernen des Gerätetests

Dieser Test verwendet den EDT-Filtertreiber, um IRP_MN_CANCEL_REMOVE_DEVICE an Zielgerätestapel zu senden.

Weitere Informationen finden Sie unter Informationen zu den Tests zum Entfernen von Geräten.

Binärdatei testen: Devfund_PnPDTest.dll

Testmethode: PNPCancelRemoveDevice

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP– Beenden des Gerätetests

Dieser Test verwendet den EDT-Filtertreiber, um IRP_MN_CANCEL_STOP_DEVICE an Zielgerätestapel zu senden.

Weitere Informationen finden Sie unter Informationen zu den Neuausgleichstests.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPCancelStopDevice

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF Gerätetest entfernen

In diesem Test wird die SetupDi-API verwendet, um eine DIF_REMOVE Anforderung an die Installationsprogramme zum Entfernen des Geräts zu senden.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPDIFRemoveAndRescanParentDevice

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP–Gerätetest deaktivieren und aktivieren

Dieser Test deaktiviert und aktiviert die Zielgeräte.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPDisableAndEnableDevice

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP Rebalance Fail Restart Device test

Dieser Test verwendet den EDT-Filtertreiber, um zu versuchen, IRP_MN_STOP_DEVICE an Zielgerätestapel zu senden. Der EDT-Filtertreiber schlägt dann IRP_MN_START_DEVICE Anforderungen (die IRP_MN_STOP_DEVICE Anforderungen folgen) fehl, um das überraschende Entfernen von Zielgeräten auszulösen.

Weitere Informationen finden Sie unter Informationen zu den Neuausgleichstests.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPTryStopDeviceAndFailRestart

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP:Neuausgleich – Anforderung neuer Ressourcen – Gerätetest

Dieser Test verwendet den EDT-Filtertreiber, um zu versuchen, IRP_MN_STOP_DEVICE an Zielgerätestapel zu senden. Außerdem werden die Ressourcenanforderungen der Geräte bearbeitet, um die Wahrscheinlichkeit zu maximieren, dass den Geräten neue Ressourcen zugeordnet werden.

Weitere Informationen finden Sie unter Informationen zu Tests zum Ausgleichen.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

Parameter: – Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP– Gerätetest entfernen

Dieser Test bewirkt, dass IRP_MN_QUERY_REMOVE_DEVICE und IRP_MN_REMOVE_DEVICE an Zielgerätestapel gesendet werden.

Weitere Informationen finden Sie unter Informationen zu Den Tests zum Entfernen von Geräten.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPRemoveAndRestartDevice

Parameter: – Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP-Gerätetest zum Beenden (Ausgleichen)

Dieser Test verwendet den EDT-Filtertreiber, um zu versuchen, IRP_MN_STOP_DEVICE an Zielgerätestapel zu senden.

Weitere Informationen finden Sie unter Informationen zu Tests zum Ausgleichen.

Testbinärdatei: Devfund_PnPDTest.dll

Testmethode: PNPTryStopAndRestartDevice

Parameter: – Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP– Test zum überraschenden Entfernen von Geräten

Dieser Test verwendet den EDT-Filtertreiber, um IRP_MN_SURPRISE_REMOVAL an Zielgerätestapel zu senden.

Weitere Informationen finden Sie unter Informationen zum Test zum Entfernen von Überraschungen.

Binärdatei testen: Devfund_PnPDTest.dll

Testmethode: PNPSurpriseRemoveAndRestartDevice

Parameter: – Siehe Testparameter für Gerätegrundlagen

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Informationen zu den Tests zum Entfernen von Geräten

  • PNP– Gerätetest entfernen
  • PNP– Test zum Entfernen des Geräts abbrechen

Der Test zum Entfernen von Geräten umfasst IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE und IRP_MN_REMOVE_DEVICE.

Der Test versucht, seinen Oberfiltertreiber auf dem Zielgerätestapel zu installieren. Dieser Versuch führt zu einem query-remove IRP.

Wenn dieses Abfrage-Entfernen-IRP fehlschlägt, startet der Test den Computer neu, um den Filtertreiber auf den Gerätestapel zu bekommen. Wenn die Entfernungsanforderung nicht abgelehnt wird, wird der Gerätestapel entfernt und mit dem Filtertreiber auf dem Gerätestapel neu gestartet.

Der Test bewirkt unter Verwendung von Setup-APIs, dass ein Abfrage-Entfernen-IRP an den Gerätestapel gesendet wird. Der Filtertreiber schlägt diese Entfernungsanforderung fehl, sodass ein Cancel-Remove-IRP gesendet wird. Der Filtertreiber bestätigt, dass das Abbrechen-Entfernen erfolgreich war.

Als Nächstes ruft die Testanwendung den geeigneten Klasseninstallierer und alle registrierten Co-Installer auf, um das Gerät zu deaktivieren oder zu aktivieren und zu entfernen oder neu aufzulisten (dies testet die Klassen- und Co-Installer-Handhabung von DIF_PROPERTYCHANGE mit DICS_DISABLE, DICS_ENABLE und DICS_PROPCHANGE). Beim Empfang von IRP_MN_REMOVE_DEVICE bestätigt der Filtertreiber, dass die niedrigeren Treiber ihn erfolgreich abgeschlossen haben.

Jeder dieser Schritte beinhaltet eine vorläufige Entfernungsanforderung. Wenn diese Anforderung abgelehnt wird, wird das Gerät nicht entfernt. Sie können bei Bedarf ein Veto gegen eine Entfernungsanforderung einlegen, z. B. beim Streamen von Videos auf einer USB-Kamera oder wenn sich das Zielgerät im Boot- oder Paging-Pfad befindet. Denken Sie daran, dass es im Allgemeinen keine gute Vorgehensweise ist, alle Löschanforderungen einfach abzulehnen. Das Fehlschlagen aller Entfernungsanforderungen garantiert nicht, dass der Treiber niemals eine Entfernung erhält, da nach einer überraschenden Entfernung immer noch ein Entfernungs-IRP ausgegeben wird oder wenn jemand im Gerätestapel einen Start-IRP nicht besteht.

Informationen zum Test zur Überraschungsentfernung

  • PNP– Test zum überraschenden Entfernen von Geräten

Der Surprise Removal-Test umfasst IRP_MN_SURPRISE_REMOVAL, gefolgt von IRP_MN_REMOVE_DEVICE.

Wie bei den vorherigen Tests versucht die Testanwendung, einen oberen Filter zum Zielgerätestapel hinzuzufügen und den Stapel dann neu zu starten. Wenn dieser Versuch nicht erfolgreich ist, startet der Test den Computer neu.

Wenn er von der Testanwendung ausgelöst wird, veranlasst der Filtertreiber das System, ein IRP_MN_SURPRISE_REMOVAL an den Gerätestapel zu senden, gefolgt von einem IRP_MN_REMOVE_DEVICE. Der Filtertreiber bestätigt, dass diese beiden IRPs von niedrigeren Treibern erfolgreich abgeschlossen wurden.

Nachdem der überraschende Entfernungstest abgeschlossen ist, wird das Gerät deinstalliert und neu aufgelistet, wobei auch der Filtertreiber aus dem Stack entfernt wird.

Informationen zu den Ausgleichstests

  • PNP-Gerätetest zum Beenden (Ausgleichen)
  • PNP:Neuausgleich – Anforderung neuer Ressourcen – Gerätetest
  • PNP-Neuausgleich – Fehler – Geräteneustart – Test
  • PNP – Test zum Abbrechen des Gerätestopps

Wie beim Entfernungstest versucht die Testanwendung, dem Zielgerätestapel unter Verwendung von SetupDiCallClassInstaller mit DIF_PROPERTYCHANGE einen übergeordneten Filter hinzuzufügen und den Gerätestapel dann neu zu starten. Wenn dieser Versuch nicht erfolgreich ist (d. h., wenn bei der query-remove-IRP an einer Stelle des Zielgerätestapels ein Fehler auftritt), startet der Test den Computer neu, um den Neuausgleich zu testen.

Je nachdem, welchen Ausgleichstest Sie auswählen, treten die folgenden Ereignisse auf:

  1. PNP-Gerätetest zum Beenden (Ausgleichen) Dieser Test initiiert eine Neuausgleichsprozedur, die zur IRP_MN_QUERY_STOP_DEVICE PnP-IRP für den Gerätetreiber führt.

    Wenn dieser IRP bei einem Treiber im Stapel fehlschlägt, wird die Neuausgleich-Prozedur abgebrochen. Bitte beachten Sie, dass Windows Vista einen mehrstufigen Neuausgleich unterstützt. Wenn ein Neuausgleich auf einem Geräteknoten gestartet wird, der kein Blatt ist, wird der Neuausgleich für alle im Gerätebaum vorhandenen Gerätestapel, deren Stamm dieser Geräteknoten ist, ebenfalls ausgeführt. Wenn in einem untergeordneten Gerätestapel der Abfragestopp fehlschlägt, wird die gesamte Neuausgleich-Prozedur abgebrochen. Daher darf es bei den Treibern zu keinem Fehlschlag des Abfragestopps kommen, wenn es dafür keinen konkreten Grund gibt. Wenn ein solcher Fehler auftritt, sendet der PnP-Manager den Abbruchstopp (IRP_MN_CANCEL_STOP) an alle Gerätestapel, an die der Abfragestopp gesendet wurde.

    Wenn alle beteiligten Gerätestapel den Abfragestopp akzeptieren, wird der Test fortgesetzt und sendet die IRPs „IRP_MN_QUERY_RESOURCE_REQUIREMENTS“ und „IRP_MN_FILTER_RESOURCE_REQUIREMENTS“, um die Ressourcenanforderung der Geräte zu finden.

    Nach diesem Punkt gibt es zwei verschiedene Möglichkeiten, je nachdem, ob das Zielgerät Ressourcen verbraucht oder nicht:

    • Wenn das Gerät keine Ressourcen verbraucht, sendet der PnP-Manager selbst einen Abbruchstopp (IRP_MN_CANCEL_STOP_DEVICE) als Optimierung.

      Wenn das Gerät tatsächlich Ressourcen verbraucht, wird das Neuausgleich-Verfahren mit den IRPs „IRP_MN_STOP_DEVICE“ und „IRP_MN_START_DEVICE“ abgeschlossen.

    Mit dieser Option ändern sich die Ressourcen des Geräts nicht.

  2. PNP–Test zum Beenden des Geräts abbrechen: Dieser Test initiiert eine Neuausgleichsprozedur, aber der Filtertreiber schlägt die Abfragestopp-IRP absichtlich fehl. Die Reihenfolge der IRPs sieht aus wie IRP_MN_QUERY_STOP_DEVICE (schlägt am Filtertreiber beim Aufrufen fehl, wodurch ein Abbruch des Neuausgleichs verursacht wird) und IRP_MN_CANCEL_STOP_DEVICE.

    Mit dieser Option ändern sich die Ressourcen des Geräts nicht.

  3. PNP:Neuausgleich – Anforderung neuer Ressourcen – Gerätetest Dieser Test initiiert einen Neuausgleich und bearbeitet auch die Ressourcenanforderung des Geräts, um die Wahrscheinlichkeit zu maximieren, dass dem Gerät tatsächlich neue Ressourcen zugeordnet werden. Diese Option hilft auch einem Gerät ohne Ressourcen dabei, das komplette Neuausgleichsverfahren zu durchlaufen:

    1. Zunächst wird der einfache Neuausgleich gestartet, wodurch die folgenden IRPs ausgelöst werden:

      • IRP_MN_QUERY_STOP_DEVICE (setzt voraus, dass diese IRP von allen Treibern erfolgreich erfüllt wurde. Der Test deckt bereits den Fall ab, dass diese IRP nicht erfüllt wurde.)
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS. Als Reaktion auf diese IRP führt der Filtertreiber beim Durchlaufen nach oben eine Aktion aus, je nachdem, ob das Gerät Ressourcen verbraucht oder nicht:
        • Wenn das Gerät nicht über eine Ressourcenanforderung verfügt, weist der Filter eine Pseudoressource zu.
        • Wenn das Gerät über eine Ressourcenanforderung verfügt, versucht der Filter, die Ressourcenanforderungsliste so neu zu strukturieren, dass die Wahrscheinlichkeit einer Änderung der aktuellen Zuweisung maximiert wird. Ein Beispiel: Ein Gerät benötigt 2 Byte Arbeitsspeicher zwischen 00 und FF, und dem Gerät ist derzeit 3A-3B zugewiesen. Hier erfolgt die Änderung so, dass die neue Ressourcenanforderung (in der Reihenfolge der Präferenz) wie 00-39 oder 3C-FF oder 3A-3B aussieht. Ähnlich wird vorgegangen, wenn die Ressourcenanforderungsliste des Geräts alternative Anforderungen enthält: Die Reihenfolge wird geändert, sodass die alternative Anforderung weiter oben in der Liste geführt wird.
    2. Jetzt sollte das Gerät das Neuausgleichsverfahren immer erfolgreich abschließen.

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE (Die neu zugewiesenen Ressourcen. Wenn Pseudoanforderungen erstellt wurden, werden die neuen Ressourcen für die tatsächlichen Treiber maskiert.)

  4. Fehler beim Neustart des PNP-Gerätetests Dieser Test initiiert eine Neuverteilung, aber wenn der Filtertreiber nach dem Ausgleich den Start erhält, schlägt er absichtlich fehl , was zu der überraschenden Entfernung von IRP gefolgt von Entfernungs-IRP führt.

    Zunächst wird das Neuausgleichsverfahren gestartet und sichergestellt, dass der Treiber einen Stopp- und einen Startbefehl erhält, indem gefälschte Ressourcenanforderungen für ein Gerät generiert werden, das keine Ressourcen verbraucht.

    • IRP_MN_QUERY_STOP_DEVICE (setzt voraus, dass diese IRP von allen Treibern erfolgreich erfüllt wurde. Der Test deckt bereits den Fall ab, dass diese IRP nicht erfüllt wurde.)
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS (Wenn die tatsächliche Ressourcenanforderung NULL ist, filtern Sie nach der Zuweisung der gefälschten Ressourcenanforderung, sodass ein Stopp- und ein Startvorgang stattfindet.)
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE (Der Filter verursacht beim Starten für diese IRP einen Fehler. Diese Aktion führt zu der Surprise-Removal-IRP.)
    • IRP_MN_SURPRISE_REMOVAL
    • IRP_MN_REMOVE

    Nachdem der Neuausgleichstest abgeschlossen ist, wird das Gerät deinstalliert und neu aufgelistet, wobei auch der Filtertreiber aus dem Stapel entfernt wird.

Gerätefehlercodes

Wenn im Test eine Fehlermeldung angezeigt wird, dass das Gerät status nicht in Ordnung ist, können Sie mehr über das Gerät status über Geräte-Manager erfahren. Eine Zusammenfassung der verschiedenen Gerätefehlercodes finden Sie unter Geräte-Manager Fehlermeldungen.

Debuggen von Installationsfehlern mithilfe der Setup-API-Protokolle

Die Setup-API-Protokolle (setupapi.app.log und setupapi.dev.log) enthalten möglicherweise nützliche Informationen zum Debuggen von Treiberinstallationsfehlern, die von diesem Test protokolliert werden. Die Setup-API-Protokolle finden Sie im Testsystem im Verzeichnis %windir%\inf\.

Um die Ausführlichkeit und potenzielle Nützlichkeit dieser Protokolle zu erhöhen, legen Sie den folgenden Registrierungsschlüssel auf 0x2000FFFF fest, bevor Sie den Neuinstallationstest ausführen:

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

Testen eines Treibers zur Laufzeit mithilfe von Visual Studio

Auswählen und Konfigurieren der Gerätegrundlagentests

Gerätegrundlagentests

Bereitgestellte WDTF Simple E/O-Plug-Ins

Testen eines Treibers zur Laufzeit über eine Eingabeaufforderung