Behandeln von Anforderungen zum Beenden eines Geräts

Es gibt zwei Umstände, in denen der PnP-Manager die Treiber eines Geräts fragt, ob das Beenden des Geräts eine gute Idee ist, bevor er die Treiber auffordert, ein Gerät zu beenden:

Es gibt mehrere Möglichkeiten, wie ein Treiber mit diesen Situationen umgehen kann:

  • Wenn Ihr Treiber WdfDeviceSetSpecialFileSupport aufgerufen hat, weil ein Gerät eine spezielle Datei unterstützt, und wenn eine spezielle Datei auf dem Gerät geöffnet ist, lässt das Framework das Beenden des Geräts nicht zu.

  • Um vorübergehend alle Stopps für einen relativ kurzen Zeitraum zu verhindern, kann der Treiber WdfDeviceSetStaticStopRemove aufrufen.

  • Um jeden Stoppversuch einzeln auszuwerten und zu verarbeiten, kann der Treiber Rückruffunktionen EvtDeviceQueryStop und EvtDeviceQueryRemove bereitstellen.

Wenn das Gerät keine speziellen Dateien unterstützt und das Beenden oder Entfernen eines Geräts nie ein Problem für den Treiber oder das Gerät ist, stellt der Treiber keine Rückruffunktionen für EvtDeviceQueryStop und EvtDeviceQueryRemove bereit und ruft nie WdfDeviceSetStaticStopRemove auf. In diesem Fall stoppt der PnP-Manager das Gerät immer, ohne vorher zu überprüfen, ob der Treiber dies zulässt.

Umverteilung von Ressourcen

Manchmal muss der PnP-Manager die Hardwareressourcen des Systems neu verteilen. In der Regel erfolgt diese Neuverteilung, weil ein Bustreiber gemeldet hat, dass ein neues Gerät angeschlossen wurde und das neue Gerät bereits zugewiesene Ressourcen benötigt. Geräte müssen beendet werden, bevor Ressourcen neu zugewiesen werden.

Wenn ihr Treiber manchmal verhindern muss, dass der PnP-Manager ein ausgelastetes Gerät beendet, kann der Treiber eine EvtDeviceQueryStop-Rückruffunktion bereitstellen. Wenn die EvtDeviceQueryStop-Rückruffunktion Ihres Treibers einen Fehler status Wert zurückgibt, beendet der PnP-Manager das Gerät nicht.

Wenn der Treiber feststellt, dass das Gerät sicher beendet werden kann, gibt die Rückruffunktion STATUS_SUCCESS zurück. Wenn keiner der anderen Treiber des Geräts das Anhalten verhindert, stoppt der PnP-Manager das Gerät vorübergehend.

Informationen zur Reihenfolge, in der das Framework die Ereignisrückruffunktionen eines Treibers aufruft, wenn der PnP-Manager ein Gerät beendet, um Ressourcen zu verteilen, finden Sie unter Der PnP-Manager verteilt Systemressourcen.

Ein Benutzer entfernt oder deaktiviert ein Gerät

Ein Benutzer kann einige Geräte entfernen oder deaktivieren. Beispiel:

  • Wenn Ihr Treiber das Removable Member (und nicht das SurpriseRemovalOK-Element ) der WDF_DEVICE_PNP_CAPABILITIES-Struktur des Geräts festgelegt hat, kann der Benutzer das Programm "Deplug or Eject Hardware" ausführen und dann das Gerät trennen oder auswerfen.

  • Wenn Ihr Treiber das NotDisable-Element der WDF_DEVICE_STATE Struktur des Geräts nicht festgelegt hat, kann der Benutzer Geräte-Manager verwenden, um das Gerät zu deaktivieren.

In solchen Fällen versucht der PnP-Manager, das Gerät zu beenden, bevor der Benutzer es entfernt.

Wenn ihr Treiber manchmal das Entfernen eines ausgelasteten Geräts verhindern muss, kann der Treiber eine EvtDeviceQueryRemove-Rückruffunktion bereitstellen. Wenn die EvtDeviceQueryRemove-Rückruffunktion eines Treibers einen Fehler status Wert zurückgibt, beendet der PnP-Manager das Gerät nicht.

Wenn der Treiber feststellt, dass es für den Benutzer sicher ist, das Gerät zu entfernen, gibt die Rückruffunktion STATUS_SUCCESS zurück. Wenn keiner der anderen Treiber des Geräts das Entfernen verhindert, stoppt der PnP-Manager das Gerät.

Informationen zur Reihenfolge, in der das Framework die Ereignisrückruffunktionen eines Treibers aufruft, wenn ein Gerät zum Entfernen beendet wird, finden Sie unter Ein Benutzer entfernt ein Gerät.