Freigeben über


Behandeln einer IRP_MN_CANCEL_STOP_DEVICE-Anforderung (Windows 2000 und höher)

Eine IRP_MN_CANCEL_STOP_DEVICE Anforderung muss zuerst vom übergeordneten Bustreiber für ein Gerät und dann von jedem nächsthöheren Treiber im Gerätestapel verarbeitet werden. Ein Treiber verarbeitet Stopp-IRPs in seiner DispatchPnP-Routine .

Als Reaktion auf eine IRP_MN_CANCEL_STOP_DEVICE-Anforderung muss ein Treiber das Gerät in den Startzustand versetzen und den normalen Betrieb fortsetzen. Treiber müssen eine Abbruch-Stopp-IRP erfolgreich sein.

Ein Treiber verarbeitet eine IRP_MN_CANCEL_STOP_DEVICE-Anforderung mit einer Prozedur wie der folgenden:

  1. Verschieben Sie den Neustart des Geräts, bis niedrigere Treiber ihre Neustartvorgänge abgeschlossen haben. (Siehe Verschieben der PnP-IRP-Verarbeitung, bis niedrigere Treiber abgeschlossen sind.)

  2. Nachdem die niedrigeren Treiber abgeschlossen sind, kehren Sie das Gerät in den Startzustand zurück.

    Die genauen Vorgänge hängen vom Gerät und vom Treiber ab.

  3. Starten Sie IRPs in der IRP-Holding-Warteschlange.

    Wenn der Treiber Anforderungen hielt, während sich das Gerät im Status "Ausstehend" befand, deaktivieren Sie das Flag "HOLD_NEW_REQUESTS", und starten Sie die IRPs in der IRP-Warteschlange. Weitere Informationen finden Sie unter Halten eingehender IRPs, wenn ein Gerät angehalten wird .

  4. Schließen Sie die IRP mit IoCompleteRequest ab.

    • In einer Funktion oder einem Filtertreiber:

      Die IoCompletion-Routine des Treibers hat STATUS_MORE_PROCESSING_REQUIRED zurückgegeben, wie unter Verschieben der PnP-IRP-Verarbeitung bis zum Abschluss der niedrigeren Treiber beschrieben. Daher muss die DispatchPnP-Routine des Treibers IoCompleteRequest aufrufen, um die E/A-Vervollständigungsverarbeitung fortzusetzen.

      Der Treiber legt Irp-IoStatus.Status> auf STATUS_SUCCESS fest, ruft IoCompleteRequest mit einer Prioritätserhöhung von IO_NO_INCREMENT auf und gibt STATUS_SUCCESS aus seiner DispatchPnP-Routine zurück.

      Treiber dürfen bei diesem Vorgang nicht fehlschlagen. Wenn ein Treiber beim Neustart-IRP fehlschlägt, befindet sich das Gerät in einem inkonsistenten Zustand und funktioniert nicht ordnungsgemäß.

    • In einem übergeordneten Bustreiber:

      Der Treiber legt Irp-IoStatus.Status> auf STATUS_SUCCESS fest und ruft IoCompleteRequest auf und gibt eine Prioritätserhöhung von IO_NO_INCREMENT an. Der Bustreiber gibt STATUS_SUCCESS aus seiner DispatchPnP-Routine zurück.

      Ein Bustreiber darf bei diesem Vorgang nicht fehlschlagen. Wenn ein Treiber beim Neustart-IRP fehlschlägt, befindet sich das Gerät in einem inkonsistenten Zustand und funktioniert nicht ordnungsgemäß.

Ein Treiber erhält möglicherweise eine falsche Abbruch-Stopp-Anforderung, wenn das Gerät gestartet und aktiv ist. Dies kann z. B. auftreten, wenn der Treiber (oder ein Treiber höher im Gerätestapel) eine IRP_MN_QUERY_STOP_DEVICE-Anforderung fehlgeschlagen ist. Wenn ein Gerät gestartet und aktiv ist, können Treiber sicher falsche Abbruch-Stopp-Anforderungen für das Gerät erfolgreich ausführen.