Erstellen von Kontexten
Nachdem ein Minifilter die kontextabhängigen Typen registriert hat, kann er einen Kontext durch Aufrufen von FltAllocateContext erstellen. Diese Routine wählt die geeignete Kontextdefinition aus, die gemäß den unter Registrieren von Kontexttypen beschriebenen Kriterien verwendet werden soll.
Vor der Zuweisung eines Kontexts und dem Versuch, ihn festzulegen, kann ein Minifilter die folgenden Routinen aufrufen, um zu bestimmen, ob das zugrunde liegende Dateisystem Datei-, Stream- oder Streamhandleskontexte unterstützt:
- FltSupportsFileContexts oder FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
Im folgenden Codebeispiel aus dem CTX-Beispiel-Minifiltertreiber ruft die CtxInstanceSetup-RoutineFltAllocateContext auf, um einen instance Kontext zu erstellen:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
Im CTX-Beispiel wird die folgende Kontextdefinition für instance Kontexte registriert:
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG }, //PoolTag
Die Kontextdefinition hat eine feste Größe, da der Size-Member CTX_INSTANCE_CONTEXT_SIZE ist (im Gegensatz zu FLT_VARIABLE_SIZED_CONTEXTS, der verwendet wird, um eine Kontextdefinition mit variabler Größe anzugeben). Beachten Sie, dass das flag FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH im Flags-Element nicht festgelegt ist. Wenn in diesem Fall der Wert des ContextSize-Parameters von FltAllocateContext mit dem des Size-Elements der Kontextdefinition übereinstimmt, ordnet FltAllocateContext den instance Kontext aus der entsprechenden nicht ausseitigen Lookaside-Liste zu. Wenn die Werte nicht übereinstimmen, schlägt FltAllocateContext mit dem Rückgabewert STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND fehl.
Bei Erfolg initialisiert FltAllocateContext die Verweisanzahl für den neuen Kontext als 1. Wenn der Kontext nicht mehr benötigt wird, muss der Minifiltertreiber diesen Verweis freigeben. Daher muss jeder Aufruf von FltAllocateContext durch einen nachfolgenden Aufruf von FltReleaseContext abgeglichen werden.
Sobald ein Kontext erstellt wurde, kann ein Minifilter ihn für ein Objekt festlegen.