Behandeln einer IRP_MN_STOP_DEVICE-Anforderung (Windows 2000 und höher)
Eine IRP_MN_STOP_DEVICE Anforderung wird zuerst vom obersten Treiber im Gerätestapel und dann von jedem nächstniedrigten Treiber verarbeitet. Ein Treiber verarbeitet Stopp-IRPs in seiner DispatchPnP-Routine .
Ein Treiber verarbeitet eine IRP_MN_STOP_DEVICE-Anforderung mit einer Prozedur wie der folgenden:
Stellen Sie sicher, dass das Gerät angehalten wird.
Wenn ein Treiber das Gerät als Reaktion auf die IRP_MN_QUERY_STOP_DEVICE Anforderung nicht vollständig angehalten hat, muss er dies jetzt tun. Legen Sie ein HOLD_NEW_REQUESTS Flag in der Geräteerweiterung fest, und führen Sie alle anderen erforderlichen Vorgänge aus, um das Gerät anzuhalten.
Das Gerät kann während des Vorgangs zum Ausgleich der Ressource Strom verlieren und somit den Gerätezustand verlieren. Treiber für das Gerät sollten alle Gerätestatusinformationen speichern und wiederherstellen, wenn sie die nachfolgende IRP_MN_START_DEVICE-Anforderung erhalten.
Geben Sie die Hardwareressourcen für das Gerät frei.
In einem Funktionstreiber hängen die genauen Vorgänge vom Gerät und dem Treiber ab, können jedoch das Trennen eines Interrupts mit IoDisconnectInterrupt, das Freigeben physischer Adressbereiche mit MmUnmapIoSpace und das Freigeben von E/A-Ports umfassen.
Wenn ein Filter- oder Bustreiber Hardwareressourcen für das Gerät erworben hat, muss dieser Treiber die Ressourcen als Reaktion auf eine IRP_MN_STOP_DEVICE Anforderung freigeben.
Legen Sie Irp-IoStatus.Status> auf STATUS_SUCCESS fest.
Übergeben Sie den IRP an den nächsten niedrigeren Treiber, oder schließen Sie den IRP ab.
Richten Sie in einem Funktions- oder Filtertreiber den nächsten Stapelspeicherort mit IoSkipCurrentIrpStackLocation ein, übergeben Sie den IRP mit IoCallDriver an den nächstniedrigen Treiber, und geben Sie den status von IoCallDriver als Rückgabe status aus der DispatchPnP-Routine zurück. Schließen Sie die IRP nicht ab.
Schließen Sie in einem Bustreiber die IRP mithilfe von IoCompleteRequest mit IO_NO_INCREMENT ab, und kehren Sie von der DispatchPnP-Routine zurück.
Während das Gerät beendet wird, um Ressourcen neu auszugleichen, kann ein Treiber keine IRPs starten, die auf das Gerät zugreifen. Ein Treiber muss solche IRPs in eine Warteschlange stellen, wie unter Halten eingehender IRPs bei Angehalten eines Geräts beschrieben, oder sie müssen fehlschlagen, wenn der Treiber keine IRP-haltende Warteschlange implementiert und keine E/A-Anforderungen löschen darf.