IRP_MJ_PNP (FS- und Filtertreiber)

Sendebedingungen

Der Plug & Play-Manager sendet die IRP_MJ_PNP-Anforderung, wenn Plug & Play Aktivität auf dem System auftritt. Andere Betriebssystemkomponenten und andere Kernelmodustreiber können abhängig vom Nebenfunktionscode auch bestimmte IRP_MJ_PNP Anforderungen senden.

Weitere Informationen zu Plug & Play IRP-Verarbeitungsanforderungen für Treiber finden Sie unter Plug & Play.

Referenzinformationen zu IRP_MJ_PNP Nebenfunktionscodes finden Sie unter Plug & Play Neben-IRPs.

Vorgang: Dateisystemtreiber

Das Dateisystem sollte den Nebenfunktionscode überprüfen, um zu ermitteln, welcher Vorgang angefordert wird. Dateisysteme müssen die folgenden Nebenfunktionscodes verarbeiten:

Code BESCHREIBUNG
IRP_MN_CANCEL_REMOVE_DEVICE Gibt an, dass eine vorherige Abfrage zum Entfernen einer Geräteanforderung abgebrochen wurde. Diese Anforderung wird gesendet, um das Dateisystem zu benachrichtigen, falls es eine Bereinigung im Zusammenhang mit dem Abbruch durchführen muss.
IRP_MN_QUERY_REMOVE_DEVICE Gibt an, dass ein Gerät entfernt werden soll. Wenn ein Dateisystem auf dem Gerät eingebunden ist, sendet der PnP-Manager diese Anforderung an das Dateisystem und an alle Dateisystemfilter. Wenn für das Gerät geöffnete Handles vorhanden sind, schlägt das Dateisystem in der Regel die Abfrage-Entfernungsanforderung fehl. Andernfalls sperrt das Dateisystem in der Regel das Volume, um zu verhindern, dass zukünftige Erstellungsanforderungen erfolgreich ausgeführt werden. Wenn ein eingebundenes Dateisystem keine Abfrage-Entfernungsanforderung unterstützt, schlägt der PnP-Manager die Abfrage-Entfernungsanforderung für das Gerät fehl.
IRP_MN_REMOVE_DEVICE Gibt an, dass ein Gerät entfernt werden soll. Wenn ein Dateisystem auf dem Gerät eingebunden ist, sendet der PnP-Manager dieses IRP an das Dateisystem und an alle Dateisystemfilter. Das Dateisystem sollte diese IRP sofort an den Speichertreiber für das Gerät übergeben und eine Vervollständigungsroutine festlegen, bei der das Dateisystem die Bereitstellung des Volumes dann auflöst.
IRP_MN_START_DEVICE Gibt an, dass ein Gerät gestartet wird. Das Dateisystem sollte diese IRP an den Speichertreiber für das Gerät übergeben.
IRP_MN_SURPRISE_REMOVAL Gibt an, dass ein Gerät entfernt wurde. Wenn ein Dateisystem auf dem Gerät eingebunden wurde, sendet der PnP-Manager dieses IRP an das Dateisystem und an alle Dateisystemfilter. Das Dateisystem sollte diese IRP sofort an den Speichertreiber für das Gerät übergeben und eine Vervollständigungsroutine festlegen, bei der das Dateisystem die Bereitstellung des Volumes dann auflöst.

Vorgang: Legacy-Dateisystemfiltertreiber

Dateisystemfiltertreiber sollten PnP-IRPs gemäß den folgenden Richtlinien verarbeiten:

  • Wenn der Benutzer ein Volume ordnungsgemäß entfernen möchte, sendet der PnP-Manager eine IRP_MN_QUERY_REMOVE_DEVICE Anforderung. Beim Empfang dieses IRP muss der Filter alle geöffneten Handles auf dem Volume schließen und den IRP an den nächstniedrigen Treiber im Stapel übergeben. Dieser Schritt ist wichtig. Wenn der Treiber nicht alle geöffneten Handles schließen kann, wird verhindert, dass das Volume aufgehoben wird, was wiederum verhindert, dass das physische Gerät ausgeworfen wird.

    Beim Empfang einer IRP_MN_QUERY_REMOVE_DEVICE-Anforderung hebt das FAT-Dateisystem sofort die Bereitstellung aller Volumes auf, die es sicher entfernen kann. Daher sollte jeder Filter, der an ein FAT-Volume angefügt ist, davon ausgehen, dass sein Filtergeräteobjekt freigegeben wird, bevor die Vervollständigungsroutine des Filters aufgerufen wird. Das NTFS-Dateisystem tut dies nicht. Daher kann ein Filter, der an ein NTFS-Volume angefügt ist, erwarten, dass sein Geräteobjekt weiterhin an das Volume angefügt ist, wenn die Vervollständigungsroutine des Filters aufgerufen wird.

  • IRPs, die nach einer IRP_MN_QUERY_REMOVE_DEVICE Anforderung empfangen werden, aber bevor eine IRP_MN_CANCEL_REMOVE_DEVICE- oder IRP_MN_REMOVE_DEVICE-Anforderung empfangen wird, können sicher den Stapel für den Speichergerätestapel übergeben werden, damit sie fehlschlagen, oder in einer Warteschlange gehalten werden, bis die Anforderung "Cancel-Remove" oder "Remove-Device" empfangen wird.

  • Wenn ein Filter eine IRP_MN_CANCEL_REMOVE_DEVICE Anforderung empfängt, nachdem er bereits alle geöffneten Handles für ein Volume als Reaktion auf eine IRP_MN_QUERY_REMOVE_DEVICE Anforderung geschlossen hat, kann er die Handles erneut öffnen. Der Filter kann dies jedoch erst in seiner Vervollständigungsroutine erneut öffnen, nachdem der IRP von den treibern darunter im Stapel erfolgreich abgeschlossen wurde.

  • Wenn ein Filter eine IRP_MN_REMOVE_DEVICE-Anforderung empfängt, muss er in der Regel keine Verarbeitung für die IRP ausführen, es sei denn, er hält IRPs seit dem Empfang der IRP_MN_QUERY_REMOVE_DEVICE-Anforderung in einer Warteschlange. Wenn er IRPs in einer Warteschlange hält, muss der Filter alle IRPs für das Volume dequedieren und ein Failover ausführen , bevor er den IRP an den nächstniedrigen Treiber im Stapel übergibt.

  • Beim Empfangen einer IRP_MN_SURPRISE_REMOVAL-Anforderung sollte der Filter die folgenden Vorgänge ausführen:

    • Schließen Sie alle geöffneten Handles für das Volume, da das Dateisystem den Stapel erst sauber kann, wenn keine ausstehenden Verweise vorhanden sind.

    • Wenn der Filter IRPs in einer Warteschlange enthält, können sie entweder fehlschlagen oder den Stapel des Speichergerätestapels übergeben, damit sie fehlschlagen.

Parameter

Ein Dateisystem oder Filtertreiber ruft IoGetCurrentIrpStackLocation für den angegebenen IRP auf, um einen Zeiger auf den eigenen Stapelspeicherort im IRP abzurufen. In den folgenden Parametern zeigt Irp auf den IRP und IrpSp auf den IO_STACK_LOCATION. Der Treiber kann die Informationen verwenden, die in den folgenden Elementen des IRP- und des IRP-Stapelspeicherorts festgelegt sind, um eine Plug & Play Anforderung zu verarbeiten:

  • DeviceObject ist ein Zeiger auf das Zielgerätobjekt.

  • Irp->IoStatus verweist auf eine IO_STATUS_BLOCK-Struktur, die die endgültige Vervollständigung status und Informationen zum angeforderten Vorgang empfängt.

  • IrpSp->FileObject sollte für PnP-IRPs auf NULL zeigen.

  • IrpSp->MajorFunction ist auf IRP_MJ_PNP festgelegt.

  • IrpSp->MinorFunction ist auf einen der folgenden Werte festgelegt:

    • IRP_MN_CANCEL_REMOVE_DEVICE
    • IRP_MN_QUERY_REMOVE_DEVICE
    • IRP_MN_REMOVE_DEVICE
    • IRP_MN_START_DEVICE
    • IRP_MN_SURPRISE_REMOVAL

Weitere Informationen

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_PNP (WDK-Kernelreferenz)

IRP_MN_CANCEL_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL