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