Löschen von Kontexten
Jeder Kontext, der durch einen erfolgreichen Aufruf von FltSetXxxContextfestgelegt wird, muss schließlich gelöscht werden.
Der Filter-Manager löscht Kontexte automatisch, wenn die folgenden Situationen auftreten:
- Die Objekte, an die die Kontexte angefügt sind, werden gelöscht.
- Ein Minifilter instance von einem Volume getrennt wird
- Der Minifiltertreiber wird entladen.
Daher ist es selten notwendig, dass ein Minifilter einen Kontext explizit löscht.
Ein Minifilter kann einen Kontext löschen, indem eine der folgenden Kontextlöschroutinen aufgerufen wird:
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
Ein Kontext kann nur gelöscht werden, wenn er derzeit für ein Objekt festgelegt ist. Ein Kontext kann nicht gelöscht werden, wenn er noch nicht festgelegt wurde oder wenn er bereits durch einen erfolgreichen Aufruf von FltSetXxxContext ersetzt wurde.
Die FltDeleteXxx-Kontextroutinen geben einen Zeiger auf den alten Kontext im OldContext-Parameter zurück, wenn OldContext nicht NULL ist und nicht auf NULL_CONTEXT zeigt. Wenn OldContextNULL ist, verringert der Filter-Manager die Verweisanzahl für den Kontext, der dann freigegeben wird, es sei denn, der Minifilter verfügt über einen ausstehenden Verweis.
Das folgende Codebeispiel zeigt, wie Sie einen Streamkontext löschen:
status = FltDeleteStreamContext(
FltObjects->Instance, //Instance
FltObjects->FileObject, //FileObject
&oldContext); //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
FltReleaseContext(oldContext);
}
In diesem Beispiel fltDeleteStreamContext:
- Entfernt den Streamkontext aus dem Stream.
- Verringert die Verweisanzahl des Kontexts nicht, da der OldContext-Parameter ungleich NULL ist.
- Gibt die Adresse des gelöschten Kontexts (der aus dem Stream entfernte Kontext) im OldContext-Parameter zurück.
Da der OldContext-Parameter ungleich NULL ist, muss der Filter nach der erforderlichen Verarbeitung den gelöschten Kontext durch Aufrufen von FltReleaseContext freigeben.