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:
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:
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.
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.
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:
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.
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.)
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
Zugehörige Themen
Testen eines Treibers zur Laufzeit mithilfe von Visual Studio
Auswählen und Konfigurieren der Gerätegrundlagentests
Bereitgestellte WDTF Simple E/O-Plug-Ins
Testen eines Treibers zur Laufzeit über eine Eingabeaufforderung