Freigeben von Kontexten
Ein Minifilter gibt einen Kontext frei, indem FltReleaseContext aufgerufen wird. Jeder erfolgreiche Aufruf einer der folgenden Routinen muss schließlich durch einen Aufruf von FltReleaseContext abgeglichen werden:
Routine für die Kontexterstellung:
Kontext-Get-Routinen:
Kontextsatzroutinen:
Inkrementroutine für Kontextreferenzen:
Beachten Sie, dass der von FltSetXxxContext zurückgegebene OldContext-Zeiger und der von FltDeleteContext zurückgegebene Kontextzeiger ebenfalls freigegeben werden müssen, wenn sie nicht mehr benötigt werden.
Im folgenden Codebeispiel aus dem CTX-Beispielminifilter erstellt und legt die CtxInstanceSetup-Routine einen instance Kontext fest und ruft dann FltReleaseContext auf:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
Beachten Sie, dass FltReleaseContext aufgerufen wird, unabhängig davon, ob der Aufruf von FltSetInstanceContext erfolgreich ist:
Wenn FltSetInstanceContext erfolgreich ist, fügt es einen eigenen Verweis auf den instance Kontext hinzu (das heißt, es erhöht die Verweisanzahl im instance Kontext). Daher wird der Verweissatz von FltAllocateContext nicht mehr benötigt, und der Aufruf von FltReleaseContext entfernt ihn.
Wenn FltSetInstanceContext fehlschlägt, verfügt der instance Kontext nur über einen Verweis, nämlich den von FltAllocateContext festgelegten Verweis. Wenn FltReleaseContext zurückgibt, weist der instance Kontext eine Verweisanzahl von 0 von 0 auf und wird vom Filter-Manager freigegeben.