Freigeben über


Entfernen eines Geräts in einem Bustreiber

Beim Entfernen eines untergeordneten Geräts (untergeordneter PDO) muss der übergeordnete Bustreiber alle Vorgänge rückgängig machen, die er zum Hinzufügen und Starten des Geräts ausgeführt hat.

Ein Bustreiber entfernt ein untergeordnetes Gerät mit einer Prozedur wie der folgenden in seiner DispatchPnP-Routine :

  1. Hat der Treiber eine vorherige IRP_MN_SURPRISE_REMOVAL Anforderung für diese pDO verarbeitet?

    Führen Sie in diesem Fall alle verbleibenden sauber aus, und fahren Sie mit Schritt 4 fort.

    Ein Treiber verwaltet in der Regel ein Flag in der Geräteerweiterung, das angibt, ob der Treiber eine IRP_MN_SURPRISE_REMOVAL Anforderung für das Gerät verarbeitet hat.

  2. Schließen Sie alle Anforderungen ab, die im Treiber in die Warteschlange gestellt werden.

  3. Entfernen Sie strom vom Gerät, wenn der Bustreiber dazu in der Lage ist, und benachrichtigen Sie den Power Manager, indem Sie PoSetPowerState aufrufen.

    Der Bustreiber schaltet das untergeordnete Gerät nach Möglichkeit aus und benachrichtigt den Energiemanager über die Änderung des Energiezustands des Geräts. Der Busfahrer tut dies als Reaktion auf die IRP_MN_REMOVE_DEVICE Anforderung. der Besitzer der Energierichtlinie des Geräts sendet keine IRP_MN_SET_POWER Anforderung, wenn das Gerät entfernt wird. Weitere Informationen finden Sie unter Energieverwaltung.

  4. Wenn der Bustreiber dieses Gerät in seiner letzten Antwort auf eine IRP_MN_QUERY_DEVICE_RELATIONS Anforderung für BusRelations gemeldet hat, ist das Gerät weiterhin physisch auf dem Computer vorhanden. In diesem Fall ist der Bustreiber wie folgt:

    • Behält die PDO für das Gerät bei, bis das Gerät physisch entfernt wurde.

    • Legt Irp-IoStatus.Status> auf STATUS_SUCCESS fest.

    • Schließt die IRP mit IoCompleteRequest ab.

    • Gibt aus der DispatchPnP-Routine zurück.

    Der Bustreiber muss dieses Gerät weiterhin in nachfolgenden Enumerationen (IRP_MN_QUERY_DEVICE_RELATIONS für BusRelations) melden, bis das Gerät physisch entfernt wird. Der PnP-Manager verfolgt, ob ein aufgezähltes Gerät hinzugefügt und gestartet wurde.

  5. Wenn das Gerät nicht in der letzten Antwort des Bustreibers auf eine IRP_MN_QUERY_DEVICE_RELATIONS Anforderung für BusRelations enthalten war, betrachtet der Bustreiber das Gerät als physisch vom Computer entfernt. In diesem Fall führt der Bustreiber folgendes aus:

    • Bereinigt gerätespezifische Zuordnungen, Arbeitsspeicher, Ereignisse usw.

    • Legt Irp-IoStatus.Status> auf STATUS_SUCCESS fest.

    • Schließt die IRP mit IoCompleteRequest ab.

    • Gibt das PDO mit IoDeleteDevice frei.

      Der Bustreiber muss das PDO löschen, wenn der Treiber das Gerät aus seiner letzten BusRelations-Liste ausgelassen hat . Wenn ein Benutzer das Gerät erneut an den Computer angibt, muss der Bustreiber als Antwort auf die nächste BusRelations-Abfrage ein neues PDO erstellen. Wenn ein Bustreiber dieselbe PDO für eine neue instance eines Geräts wiederverwendet, funktioniert der Computer nicht ordnungsgemäß.

    • Gibt aus der DispatchPnP-Routine zurück.

Wenn das Gerät noch vorhanden ist, wenn der PnP-Manager die IRP_MN_REMOVE_DEVICE Anforderung sendet, behält der Bustreiber die PDO bei. Wenn das Gerät zu einem späteren Zeitpunkt physisch aus dem Bus entfernt wird, sendet der PnP-Manager eine weitere IRP_MN_REMOVE_DEVICE. Nach Erhalt der anschließenden Entfernungs-IRP löscht der Bustreiber die PDO für das Gerät.

Ein Bustreiber muss in der Lage sein, eine IRP_MN_REMOVE_DEVICE für ein Gerät zu verarbeiten, das er bereits entfernt hat und dessen PDO zum Löschen markiert ist. Als Reaktion auf eine solche IRP kann der Bustreiber dem IRP folgen oder STATUS_NO_SUCH_DEVICE zurückgeben. Das PDO für das Gerät wurde in diesem Fall trotz des vorherigen Aufrufs von IoDeleteDevice durch den Bustreiber noch nicht gelöscht, da eine Komponente noch einen Verweis auf das -Objekt enthält. Daher kann der Bustreiber auf das PDO zugreifen, während er die zweite Entfernungs-IRP verarbeitet. Der Busfahrer darf IoDeleteDevice nicht ein zweites Mal für die PDO aufrufen. das E/A-System löscht die PDO, wenn die Referenzanzahl 0 erreicht.

Ein Bustreiber entfernt seine Datenstrukturen für ein untergeordnetes Gerät erst, wenn er eine IRP_MN_REMOVE_DEVICE Anforderung für das Gerät empfängt. Ein Bustreiber erkennt möglicherweise, dass ein Gerät entfernt wurde, und ruft IoInvalidateDeviceRelations auf, aber er darf die PDO des Geräts erst löschen, wenn der PnP-Manager eine IRP_MN_REMOVE_DEVICE Anforderung sendet.