Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie Dateisystem-Minifiltertreiber (Minifilter) in einer Windows-Umgebung dynamisch geladen und entladen werden können. Er behandelt den Initialisierungs- und Registrierungsprozess, die Instanzenverwaltung und die Löschprozeduren, um eine ordnungsgemäße Bereinigung und Ressourcenverwaltung während des Ladens und Entladens von Treibern sicherzustellen.
Laden
Ein Minifilter wird entsprechend den vorhandenen Ladereihenfolge-Gruppendefinitionen geladen, wenn die INF-Datei des Minifilters den Treiberstarttyp SERVICE_BOOT_START, SERVICE_SYSTEM_START oder SERVICE_AUTO_START angibt. Diese Ladereihenfolge unterstützt die Interoperabilität mit älteren Filtertreibern. Das Laden ist jederzeit möglich, während das System ausgeführt wird.
Ein Minifilter kann auf folgende Weise geladen werden, während das System ausgeführt wird:
Über eine Dienststartanforderung (sc start, net start oder die Dienst-APIs).
Über eine explizite Ladeanforderung (fltmc load, FltLoadFilter oder FilterLoad).
Der Filter-Manager (FltMgr) ruft die DriverEntry-Routine des Minifilters auf, sobald der Treiber geladen wurde. Zu diesem Zeitpunkt kann der Minifilter die Initialisierung durchführen, die für alle Instanzen des Minifilters gilt. Innerhalb seiner DriverEntry-Routine ruft der Minifilter FltRegisterFilter auf, um Rückrufroutinen mit FltMgr und FltStartFiltering zu registrieren und FltMgr zu benachrichtigen, dass der Minifilter bereit ist, sich an Volumes anzuhängen und E/A-Anforderungen zu filtern.
Minifilter-Treiberinstanzen werden in der INF-Datei definiert, die zum Installieren des Minifilters verwendet wird. Die INF-Datei eines Minifilters muss eine Standardinstanz und kann zusätzliche Instanzen definieren. Diese Definitionen gelten für alle Volumes. Jede Instanzendefinition enthält den Namen der Instanz, die Höhe und die Flags, die angeben, ob die Instanz automatisch, manuell oder in beiden Weisen angefügt werden kann. Die Standardinstanz wird verwendet, um Minifilter anzuordnen, so dass FltMgr die Bereitstellungs- und Instanzeneinrichtungsroutinen des Minifilters in der korrekten Reihenfolge aufruft. Die Standardinstanz wird auch mit expliziten Anlagenanforderungen verwendet, wenn der Aufrufer keinen Instanzennamen angibt.
FltMgr benachrichtigt automatisch einen Minifilter über ein verfügbares Volume, indem die InstanceSetupCallback-Routine für den ersten Erstellungsvorgang aufgerufen wird, nachdem das Volume bereitgestellt wurde. Dieser Aufruf kann in den folgenden Fällen auftreten:
Bevor FltStartFiltering zurückgegeben wird, wenn FltMgr vorhandene Volumes beim Systemstart enumeriert.
Zur Laufzeit, wenn ein Volume bereitgestellt oder als Ergebnis einer expliziten Anlagenanforderung (fltmc attach, FltAttachVolume oder FilterAttach) verfügbar gemacht wird.
Entladen
Eine Minifilterinstanz wird gelöscht, wenn Folgendes eintritt:
Der Minifilter wird entladen.
Die Bereitstellung des Volumes, an das die Minifilterinstanz angefügt ist, wird aufgehoben.
Es erfolgt eine explizite Abtrennanforderung (fltmc detach, FltDetachVolume oder FilterDetach). Wenn der Minifilter eine InstanceQueryTeardownCallback-Routine registriert, kann er eine explizite Trennanforderung fehlschlagen lassen, indem FilterDetach oder FltDetachVolume aufgerufen wird.
Der Löschvorgang wird wie folgt fortgesetzt:
Wenn der Minifilter eine InstanceTeardownStartCallback-Rückrufroutine registriert, ruft FltMgr ihn zu Beginn des Löschvorgangs auf. In dieser Routine sollte der Minifilter Folgendes tun:
- Abschließen aller ausstehenden Vorgänge.
- Abbrechen oder Abschließen anderer Arbeiten, wie etwa E/A-Anforderungen, die vom Minifilter generiert wurden.
- Beenden des Setzens neuer Arbeitselemente in die Warteschlange.
Während des Löschens einer Instanz gilt:
- Alle derzeit ausgeführten Voroperations- oder Postoperationsrückrufroutinen setzen ihre normale Verarbeitung fort.
- Jede E/A-Anforderung, die auf einen Postoperationsrückruf wartet, kann „abgelassen“ oder abgebrochen werden.
- Alle vom Minifilter generierten E/A-Anforderungen setzen ihre normale Verarbeitung fort, bis sie abgeschlossen sind.
Wenn der Minifilter eine InstanceTeardownCompleteCallback-Routine registriert, ruft FltMgr diese Routine auf, nachdem alle ausstehenden E/A-Vorgänge abgeschlossen wurden. In dieser Routine schließt der Minifilter alle Dateien, die noch geöffnet sind.
Nachdem alle offenen Verweise auf die Instanz freigegeben wurden, löscht FltMgr verbleibende Kontexte, und die Instanz wird vollständig beseitigt.
Ein Minifilter kann auf folgende Weise entladen werden, während das System ausgeführt wird:
Über eine Dienststopp-Anforderung (sc stop, net stop oder die Dienst-APIs).
Durch eine explizite Entlade-Anforderung (fltmc unload, FltUnloadFilter oder FilterUnload). Der Minifilter wird unabhängig von Abhängigkeiten, die für den Service Control Manager (SCM) registriert sind, entladen.
Die FilterUnloadCallback-Routine eines Minifilters wird aufgerufen, wenn der Minifilter entladen wird. Diese Routine schließt alle geöffneten Kommunikationsserverports, ruft FltUnregisterFilter auf und führt alle erforderlichen Bereinigungen aus. Die Registrierung dieser Routine ist optional. Wenn der Minifilter jedoch keine FilterUnloadCallback-Routine registriert, kann er nicht entladen werden. Weitere Informationen zu dieser Routine finden Sie unter Schreiben einer FilterUnloadCallback-Routine.
Filtermanager-Routinen zum Laden und Entladen von Minifiltern
FltMgr bietet die folgenden Unterstützungsroutinen für explizite Lade- und Entladungsanforderungen, die vom Benutzermodus oder Kernelmodus ausgegeben werden können:
Die folgenden Routinen werden zum Registrieren und Aufheben der Registrierung von Rückrufroutinen verwendet, z. B. Setup und Teardown:
Minifilter-Treiberrückrufroutinen für Setup, Teardown und Unload
Die folgenden Minifilter-Treiberrückrufroutinen werden als Mitglieder der FLT_REGISTRATION-Struktur gespeichert, die als Parameter an FltRegisterFilter übergeben wird:
| Name des Mitglieds der Rückrufroutine | Rückrufroutinentyp |
|---|---|
| InstanceSetupCallback | PFLT_INSTANCE_SETUP_CALLBACK |
| InstanceQueryTeardownCallback | PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK |
| InstanceTeardownStartCallback | PFLT_INSTANCE_TEARDOWN_CALLBACK |
| InstanceTeardownCompleteCallback | PFLT_INSTANCE_TEARDOWN_CALLBACK |
| FilterUnloadCallback | PFLT_FILTER_UNLOAD_CALLBACK |