Ein Benutzer entfernt ein Gerät
Während ein System ausgeführt wird, kann ein Benutzer ein Gerät auf zwei Arten entfernen: durch geordnetes Entfernen, d. h. der Benutzer informiert das System, dass das Gerät entfernt werden soll (z. B. mithilfe des Programms "Deplug" oder "Hardware auswerfen"). oder durch überraschendes Entfernen, was bedeutet, dass der Benutzer das Gerät absteckt, ohne das System zu informieren. Wenn der Bus eine überraschende Entfernung (z. B. USB) unterstützt, müssen die Treiber des Geräts in der Lage sein, das plötzliche Verschwinden des Geräts zu bewältigen.
Geordnete Entfernung
Der Benutzer fordert die Entfernung an, indem er das Programm "Entstöpseln" oder "Auswerfen" des Systems verwendet, das Gerät mithilfe von Geräte-Manager deaktiviert oder die Auswurftaste eines auswerfenden Geräts drückt. Das Framework ermöglicht das Entfernen oder Deaktivieren des Geräts, es sei denn, der Treiber verfügt über Folgendes:
WdfDeviceSetSpecialFileSupport heißt und eine spezielle Datei ist auf dem Gerät geöffnet.
WdfDeviceSetStaticStopRemove aufgerufen.
Es wurde eine EvtDeviceQueryRemove-Rückruffunktion bereitgestellt, und die Rückruffunktion hat ein Veto gegen die Entfernung erteilt.
Für jede Funktion und jeden Filtertreiber, der das Gerät unterstützt, führt das Framework nacheinander einen Treiber nacheinander aus, beginnend mit dem Treiber, der am höchsten im Treiberstapel ist:
Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die Rückruffunktion EvtDeviceSelfManagedIoSuspend des Treibers auf.
Das Framework beendet alle stromseitig verwalteten E/A-Warteschlangen des Treibers.
Wenn die Hardware und der Treiber DMA unterstützen, ruft das Framework die Rückruffunktionen EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush und EvtDmaEnablerDisablerDisable ( sofern vorhanden) des Treibers für jeden erstellten DMA-Kanal auf.
Das Framework ruft die EvtDeviceD0ExitPreInterruptsDisabled-Rückruffunktion des Treibers auf (sofern vorhanden), und ruft dann die EvtInterruptDisable-Rückruffunktion des Treibers (sofern vorhanden) für jeden Interrupt auf, damit der Treiber Geräteunterbrechungen deaktivieren kann.
Das Framework ruft die Rückruffunktion EvtDeviceD0Exit des Treibers auf (sofern vorhanden).
Das Framework ruft die EvtDeviceReleaseHardware-Rückruffunktion des Treibers auf (sofern vorhanden), und übergibt ihr die Liste der Hardwareressourcen, die der PnP-Manager dem Gerät zugewiesen hat.
Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die EvtDeviceSelfManagedIoFlush-Rückruffunktion des Treibers auf.
Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die Rückruffunktion EvtDeviceSelfManagedIoCleanup des Treibers auf.
Der Bustreiber ist der Treiber im Stapel, der zuletzt aufgerufen wird. Wenn das Framework die Rückruffunktion EvtDeviceD0Exit des Bustreibers aufruft, legt die Rückruffunktion den Energiezustand des Geräts (ein untergeordnetes Gerät des Busses) auf D3 fest. Der Bustreiber kann steuern, wann das Framework seine EvtDeviceReleaseHardware-Rückruffunktion aufruft , indem er WdfDeviceInitSetReleaseHardwareOrderOnFailure aufruft.
Überraschendes Entfernen
Ein Benutzer entfernt ein Gerät unerwartet. Der Bustreiber für den Bus des Geräts erkennt, dass das Gerät fehlt, und ruft WdfChildListUpdateChildDescriptionAsMissing auf.
Für jede Funktion und jeden Filtertreiber, der das Gerät unterstützt, führt das Framework nacheinander einen Treiber nacheinander aus, beginnend mit dem Treiber, der am höchsten im Treiberstapel ist:
- Das Framework ruft die EvtDeviceSurpriseRemoval-Rückruffunktion des Treibers auf (sofern vorhanden).
- Wenn sich das Gerät beim Entladen des Steckers im Betriebszustand (D0) befand:
- Das Framework beendet alle stromseitig verwalteten E/A-Warteschlangen des Treibers.
- Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die Rückruffunktion EvtDeviceSelfManagedIoSuspend des Treibers auf.
- Wenn die Hardware und der Treiber DMA unterstützen, ruft das Framework die Rückruffunktionen EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush und EvtDmaEnablerDisablerDisable ( sofern vorhanden) des Treibers für jeden erstellten DMA-Kanal auf.
- Das Framework ruft die Rückruffunktionen EvtDeviceD0ExitPreInterruptsDisabled und EvtInterruptDisable des Treibers auf (sofern vorhanden), damit der Treiber Geräteunterbrechungen deaktivieren kann.
- Das Framework ruft die Rückruffunktion EvtDeviceD0Exit des Treibers auf (sofern vorhanden).
- Das Framework ruft die EvtDeviceReleaseHardware-Rückruffunktion des Treibers auf (sofern vorhanden), und übergibt die Liste der Hardwareressourcen, die der PnP-Manager dem Gerät zugewiesen hat.
- Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die EvtDeviceSelfManagedIoFlush-Rückruffunktion des Treibers auf.
- Wenn der Treiber selbstverwaltete E/A verwendet, ruft das Framework die Rückruffunktion EvtDeviceSelfManagedIoCleanup des Treibers auf.
Beachten Sie, dass ein Gerät jederzeit unerwartet entfernt werden kann. Daher kann das Framework die EvtDeviceSurpriseRemoval-Rückruffunktion des Treibers zu einem anderen Zeitpunkt aufrufen als die in den vorherigen Schritten gezeigte. Wenn ein Benutzer beispielsweise unerwartet das Gerät absteckt, während es in einen Zustand mit geringer Leistung wechselt, kann das Framework die Rückruffunktion EvtDeviceSurpriseRemoval aufrufen, nachdem es die Rückruffunktion EvtDeviceReleaseHardware aufgerufen hat. Sie dürfen eine EvtDeviceSurpriseRemoval-Rückruffunktion nicht so codieren, dass sie und andere Rückruffunktionen in einer bestimmten Sequenz aufgerufen werden.
Darüber hinaus synchronisiert das Framework die EvtDeviceSurpriseRemoval-Rückruffunktion eines Geräts nicht mit einer der Rückruffunktionen, die in den vorherigen Schritten für dieses Gerät aufgeführt sind. Daher kann die Rückruffunktion EvtDeviceSurpriseRemoval ausgeführt werden, während eine andere der zuvor aufgeführten Rückruffunktionen ebenfalls ausgeführt wird.