Verweisen auf Kontexte

Der Filter-Manager verwendet die Verweiszählung, um die Lebensdauer eines Minifilterkontexts zu verwalten. Eine Verweisanzahl ist eine Zahl, die den Status eines Kontexts angibt.

Wenn ein Kontext erfolgreich erstellt wurde, initialisiert FltMgr die Verweisanzahl des Kontexts in 1. Dies wird als anfänglicher Verweis auf den Kontext bezeichnet.

Wenn auf einen Kontext verwiesen wird, z. B. durch einen erfolgreichen Kontextsatz oder get, erhöht FltMgr die Verweisanzahl des Kontexts um eins.

Wenn ein Kontext nicht mehr benötigt wird, muss seine Verweisanzahl verringert werden. Eine positive Verweisanzahl bedeutet, dass der Kontext verwendbar ist. Wenn die Verweisanzahl null ist, ist der Kontext unbrauchbar, und FltMgr gibt ihn schließlich frei.

FltMgr gibt den anfänglichen Verweis auf den Kontext frei (verringert die Verweisanzahl auf Null), wenn das Objekt abgerissen wird, und ruft dann den optionalen Kontextbereinigungsrückruf des Filters auf. Dies tritt zwar selten auf, wenn ein Minifilter vor dem Löschen einen Kontext aus einem Objekt entfernen muss, muss der Minifilter diesen anfänglichen Verweis auf den Kontext durch Aufrufen von FltDeleteContext sicher freigeben.

Ein Minifilter kann einen eigenen Verweis auf einen Kontext hinzufügen, indem FltReferenceContext aufgerufen wird, um die Verweisanzahl des Kontexts zu erhöhen. Der Minifilter muss diesen hinzugefügten Verweis schließlich entfernen, indem FltReleaseContext aufgerufen wird.

Im Folgenden finden Sie ein kurzes Beispiel für den Verlauf der Verweisanzahl für ein typisches Objekt. Angenommen, alle Flt-API-Aufrufe sind erfolgreich.

Filterrückruf Flt-API mit dem Namen Anzahl von Kontextverweisen BESCHREIBUNG
PreCreate FltAllocateContext 1 Der Filter verarbeitet eine Voraberstellung und entscheidet, dass er die Datei nachverfolgen möchte. Er ordnet einen Streamkontext zu, wodurch FltMgr die Verweisanzahl auf 1 initialisiert. Der Filter übergibt den Kontext über den CompletionContext-Parameter an seinen PostCreate-Rückruf.
PostErstellen FltSetStreamContext 2 Der Filter hat den Kontext, den er während preCreate zugeordnet hat, an seinen PostCreate-Rückruf übergeben. Die Erstellung war erfolgreich, sodass der Filter den Kontext anfügt, wodurch FltMgr die Verweisanzahl erhöht.
PostErstellen FltReleaseContext 1 Da FltSetStreamContext die Verweisanzahl erhöht hat, muss der Filter die zusätzliche Anzahl entfernen. Die Verweisanzahl ist 1, nachdem der Filter den Kontext freigegeben hat, sodass der Kontext aktiv bleibt. Wenn der Filter entschieden hätte, dass er diese Datei nicht interessiert, hätte er den Aufruf von FltSetStreamContext und einfach FltReleaseContext übersprungen. In diesem Fall wäre die Anzahl auf 0 und die Zuordnung des Kontexts aufgehoben worden.
PreRead FltGetStreamContext 2 Der Filter sieht eine Lese-E/A und möchte wissen, ob er diese Datei nachverfolgt. Es fordert seinen Streamkontext an und ruft ihn ab, sodass er weiß, dass es diese Datei nachverfolgen möchte. FltMgr erhöht die Verweisanzahl.
PreRead FltReleaseContext 1 Der Filter wird mithilfe seines Kontexts ausgeführt, sodass er ihn freigibt, wodurch die Verweisanzahl verringert wird. Jeder FltGet*-Kontext muss mit einem FltReleaseContext ausgeglichen werden.
PreCleanup FltGetStreamContext 2 Der Filter fordert den Kontext an und ruft den Kontext ab, wodurch die Verweisanzahl erhöht wird.
PreCleanup FltReleaseContext 1 Der Filter erfolgt mithilfe des Kontexts, sodass er freigegeben wird, wodurch die Verweisanzahl verringert wird.
Kontextbereinigungsrückruf 0 Das Dateisystem reißt das zugrunde liegende Streamobjekt ab. (Im speziellen Fall eines Streamobjekts wird der Teardown durch IRP_MJ_CLOSE ausgelöst. FltMgr verringert die Verweisanzahl auf 0 und ruft dann den Kontextbereinigungsrückruf des Filters auf. Der Filter hat jetzt die Möglichkeit, seinen Kontext zu sauber.