Arbeiten mit dem GUID_DEVICE_RESET_INTERFACE_STANDARD

Die GUID_DEVICE_RESET_INTERFACE_STANDARD-Schnittstelle definiert eine Standardmethode für Funktionstreiber, um zu versuchen, ein fehlerhaftes Gerät zurückzusetzen und wiederherzustellen.

Über diese Schnittstelle sind zwei Arten von Gerätezurücksetzungen verfügbar:

  • Gerätezurücksetzung auf Funktionsebene. In diesem Fall ist der Zurücksetzungsvorgang auf ein bestimmtes Gerät beschränkt und für andere Geräte nicht sichtbar. Das Gerät bleibt während der gesamten Zurücksetzung mit dem Bus verbunden und kehrt nach dem Zurücksetzen in einen gültigen Zustand (Anfangszustand) zurück. Diese Art der Zurücksetzung hat die geringsten Auswirkungen auf das System.

    • Diese Art des Zurücksetzens kann entweder vom Bustreiber oder von ACPI-Firmware implementiert werden. Der Bustreiber kann eine Zurücksetzung auf Funktionsebene implementieren, wenn die Busspezifikation einen In-Band-Reset-Mechanismus definiert, der die Anforderung erfüllt. ACPI-Firmware kann optional eine vom Bustreiber definierte Zurücksetzung auf Funktionsebene mit einer eigenen Implementierung außer Kraft setzen.
  • Zurücksetzung des Geräts auf Plattformebene. In diesem Fall führt der Reset-Vorgang dazu, dass das Gerät im Bus als fehlt gemeldet wird. Der Reset-Vorgang wirkt sich auf ein bestimmtes Gerät und alle anderen Geräte aus, die über dieselbe Power Rail- oder Reset-Leitung mit diesem verbunden sind. Diese Art der Zurücksetzung hat die größten Auswirkungen auf das System. Das Betriebssystem wird die Stapel aller betroffenen Geräte abreißen und neu erstellen, um sicherzustellen, dass alles aus einem leeren Zustand neu gestartet wird.

Ab Windows 10 konfigurieren die folgenden Registrierungseinträge unter dem HKLM\SYSTEM\CurrentControlSet\Control\Pnp Schlüssel den Vorgang zum Zurücksetzen:

  • DeviceResetRetryInterval: Zeitraum, bevor der Zurücksetzungsvorgang gestartet wird. Der Standardwert ist 3 Sekunden. Der Mindestwert beträgt 100 Millisekunden; Der Höchstwert beträgt 30 Sekunden.

  • DeviceResetMaximumRetries: Anzahl der Versuche des Zurücksetzens.

Hinweis

Die GUID_DEVICE_RESET_INTERFACE_STANDARD-Schnittstelle ist ab Windows 10 verfügbar.

Verwenden der Gerätezurücksetzungsschnittstelle

Wenn ein Funktionstreiber erkennt, dass das Gerät nicht ordnungsgemäß funktioniert, sollte er zuerst eine Zurücksetzung auf Funktionsebene versuchen. Wenn das Problem durch ein Zurücksetzen auf Funktionsebene nicht behoben wird, kann der Treiber versuchen, eine Zurücksetzung auf Plattformebene zu versuchen. Ein Zurücksetzen auf Plattformebene sollte jedoch nur als letzte Option verwendet werden.

Um diese Schnittstelle abzufragen, sendet ein Gerätetreiber eine IRP_MN_QUERY_INTERFACE IRP nach unten im Treiberstapel. Für diese IRP legt der Treiber den Eingabeparameter InterfaceType auf GUID_DEVICE_RESET_INTERFACE_STANDARD fest. Nach erfolgreichem Abschluss des IRP ist der Interface-Ausgabeparameter ein Zeiger auf eine DEVICE_RESET_INTERFACE_STANDARD-Struktur. Diese Struktur enthält einen Zeiger auf die DeviceReset-Routine, mit der eine Zurücksetzung auf Funktions- oder Plattformebene angefordert werden kann.

Unterstützung der Gerätezurücksetzungsschnittstelle in Funktionstreibern

Um die Schnittstelle zum Zurücksetzen des Geräts zu unterstützen, muss der Gerätestapel die folgenden Anforderungen erfüllen.

Der Funktionstreiber muss IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE und IRP_MN_SURPRISE_REMOVAL ordnungsgemäß verarbeiten.

Wenn der Treiber IRP_MN_QUERY_REMOVE_DEVICE empfängt, sollte in den meisten Fällen ein Erfolg zurückgegeben werden, damit das Gerät sicher entfernt werden kann. Es kann jedoch vorkommen, dass das Gerät nicht sicher beendet werden kann, z. B. wenn das Gerät in einer Schleife hängen bleibt, die in einen Speicherpuffer schreibt. In solchen Fällen sollte der Treiber STATUS_DEVICE_HUNG an IRP_MN_QUERY_REMOVE_DEVICE zurückgeben. Der PnP-Manager führt den IRP_MN_QUERY_REMOVE_DEVICE- und IRP_MN_REMOVE_DEVICE-Prozess fort, aber dieser bestimmte Stapel empfängt keine IRP_MN_REMOVE_DEVICE. Stattdessen erhält der Gerätestapel IRP_MN_SURPRISE_REMOVAL, nachdem das Gerät zurückgesetzt wurde.

Weitere Informationen zu diesen IRPs finden Sie unter:

Behandeln einer IRP_MN_QUERY_REMOVE_DEVICE-Anforderung

Behandeln einer IRP_MN_REMOVE_DEVICE-Anforderung

Behandeln einer IRP_MN_SURPRISE_REMOVAL-Anforderung

Unterstützung der Gerätezurücksetzungsschnittstelle in Filtertreibern

Filtertreiber können IRP_MN_QUERY_INTERFACE IRPs abfangen, die über den GUID_DEVICE_RESET_INTERFACE_STANDARD-Schnittstellentyp verfügen. Auf diese Weise können sie weiterhin an die GUID_DEVICE_RESET_INTERFACE_STANDARD-Schnittstelle delegieren, aber gerätespezifische Vorgänge vor oder nach dem Zurücksetzungsvorgang ausführen. Alternativ können sie die vom Bustreiber zurückgegebene GUID_DEVICE_RESET_INTERFACE_STANDARD-Schnittstelle mit einer eigenen Schnittstelle überschreiben, um einen eigenen Zurücksetzungsvorgang bereitzustellen.

Unterstützung der Gerätezurücksetzungsschnittstelle in Bustreibern

Bustreiber, die am Vorgang zum Zurücksetzen des Geräts teilnehmen (d. a. Bustreiber, die dem Gerät zugeordnet sind, das die Zurücksetzung anfordert, und Bustreiber, die Geräten zugeordnet sind, die auf die Zurücksetzungsanforderung reagieren), müssen eine der folgenden Anforderungen erfüllen:

  • Hot Plug-fähig sein. Der Bustreiber muss in der Lage sein, ein Gerät zu erkennen, das ohne Vorheriges aus dem Bus entfernt wird, und ein Gerät, das an den Bus angeschlossen ist.

  • Alternativ muss die GUID_REENUMERATE_SELF_INTERFACE_STANDARD-Schnittstelle implementiert werden. Dadurch wird ein Gerät simuliert, das von einem Bus gezogen und wieder eingesteckt wird. Integrierte Bustreiber (z. B. PCI und SDBUS) unterstützen diese Schnittstelle. Wenn das zurückgesetzte Gerät einen dieser Busse verwendet, sollten daher keine Bustreiberänderungen erforderlich sein.

Für WDF-basierte Bustreiber registriert das WDF-Framework die GUID_REENUMERATE_SELF_INTERFACE_STANDARD-Schnittstelle im Namen der Treiber. Daher ist die Registrierung dieser Schnittstelle für diese Treiber nicht erforderlich. Wenn der Bustreiber einige Vorgänge ausführen muss, bevor seine untergeordneten Geräte neu aufgezählt werden, muss er sich für die Rückrufroutine EvtChildListDeviceReenumerated registrieren und die Vorgänge in dieser Routine ausführen. Da diese Rückrufroutine für alle PDO parallel aufgerufen werden kann, muss der Code in der Routine möglicherweise vor Racebedingungen geschützt werden.

ACPI Firmware: Zurücksetzen auf Funktionsebene

Um das Zurücksetzen von Geräten auf Funktionsebene zu unterstützen, muss eine _RST-Methode innerhalb des Gerätebereichs definiert sein. Falls vorhanden, überschreibt diese Methode die Implementierung der Gerätezurücksetzung auf Funktionsebene (falls vorhanden) des Bustreibers für dieses Gerät. Bei Ausführung muss die _RST-Methode nur dieses Gerät zurücksetzen und darf sich nicht auf andere Geräte auswirken. Darüber hinaus muss das Gerät auf dem Bus verbunden bleiben.

ACPI-Firmware: Zurücksetzen auf Plattformebene

Um das Zurücksetzen von Geräten auf Plattformebene zu unterstützen, gibt es zwei Optionen:

  • Die ACPI-Firmware kann eine PowerResource definieren, die die _RST-Methode implementiert, und alle Geräte, die von dieser Zurücksetzungsmethode betroffen sind, können auf diese PowerResource über ein _PRR-Objekt verweisen, das unter ihrem Device-Bereich definiert ist.

  • Das Gerät kann ein _PR3-Objekt deklarieren. In diesem Fall verwendet der ACPI-Treiber den D3cold-Netzbetrieb, um das Zurücksetzen durchzuführen, und die Zurücksetzungsabhängigkeiten zwischen Geräten werden vom _PR3-Objekt bestimmt.

Wenn das _PRR -Objekt im Gerätebereich vorhanden ist, verwendet der ACPI-Treiber die _RST-Methode in der PowerResource, auf die verwiesen wird, um die Zurücksetzung durchzuführen. Wenn kein _PRR-Objekt definiert ist, aber das _PR3-Objekt definiert ist, verwendet der ACPI-Treiber die D3cold-Stromversorgung, um die Zurücksetzung durchzuführen. Wenn weder das _PRR- noch _PR3-Objekt definiert ist, unterstützt das Gerät keine Zurücksetzung auf Plattformebene, und der ACPI-Treiber meldet, dass das Zurücksetzen auf Plattformebene nicht verfügbar ist.

Überprüfen der ACPI-Firmware auf dem Testsystem

Führen Sie dieses Verfahren aus, um Ihren Treiber zu testen, der das Zurücksetzen und die Wiederherstellung des Geräts unterstützt. Bei diesem Verfahren wird davon ausgegangen, dass Sie diese ASL-Beispieldatei verwenden.

DefinitionBlock("SSDT.AML", "SSDT", 0x01, "XyzOEM", "TestTabl", 0x00001000)
{
   Scope(\_SB_)
      {
       PowerResource(PWFR, 0x5, 0x0)
       {
           Method(_RST, 0x0, NotSerialized)    { }
           
           // Placeholder methods as power resources need _ON, _OFF, _STA.
           Method(_STA, 0x0, NotSerialized)
           {
               Return(0xF)
           }

           Method(_ON_, 0x0, NotSerialized)    { }

           Method(_OFF, 0x0, NotSerialized)    { }

       } // PowerResource()
   } // Scope (\_SB_)

   // Assumes WiFi device is declared under \_SB.XYZ.
   Scope(\_SB_.XYZ.WIFI)
       {

       // Declare PWFR as WiFi reset power rail
       Name(_PRR, Package(One)
           {
               \_SB_.PWFR
           })
       } // Scope (\_SB)
}
  1. Kompilieren Sie die ASL-Testdatei mit einem ASL-Compiler, z. B. Asl.exe. Die ausführbare Datei, die im Windows Driver Kit (WDK) enthalten ist.
Asl <test>.asl

Der vorherige Befehl generiert SSDT.aml.

  1. Benennen Sie SSDT.aml in acpitabl.dat um.

  2. Kopieren Sie acpitabl.dat in %systemroot%\system32 auf dem Testsystem.

  3. Aktivieren Sie die Testsignatur auf dem Testsystem.

bcdedit /set testsigning on
  1. Starten Sie das Testsystem neu.

  2. Überprüfen Sie, ob die Tabelle geladen ist. Verwenden Sie im Windows-Debugger diese Befehle.

  • !acpicache
  • dt _DESCRIPTION_HEADER Adresse der SSDT-Tabelle
0: kd> !acpicache
Dumping cached ACPI tables...
  SSDT @(ffffffffffd03018) Rev: 0x1 Len: 0x000043 TableID: TestTabl
  XSDT @(ffffffffffd05018) Rev: 0x1 Len: 0x000114 TableID: HSW-FFRD
       ...
       ...
 
0: kd> dt _DESCRIPTION_HEADER ffffffffffd03018
ACPI!_DESCRIPTION_HEADER
   +0x000 Signature        : 0x54445353
   +0x004 Length           : 0x43
   +0x008 Revision         : 0x1 ''
   +0x009 Checksum         : 0x37 '7'
   +0x00a OEMID            : [6]  "XyzOEM"
   +0x010 OEMTableID       : [8]  "TestTabl"
   +0x018 OEMRevision      : 0x1000
   +0x01c CreatorID        : [4]  "MSFT"
   +0x020 CreatorRev       : 0x5000000

Weitere Informationen

_DEVICE_RESET_INTERFACE_STANDARD