Festlegen von Kontexten

Nach dem Erstellen eines neuen Kontexts kann ein Minifiltertreiber es an ein Objekt anfügen, indem eine der folgenden Satzroutinen aufgerufen wird:

Die Setroutine führt je nach Dem Wert des Operation-Parameters folgendes aus:

  • If Operation == FLT_SET_CONTEXT_KEEP_IF_EXISTS:

    • Wenn der Minifilter noch keinen Kontext desselben Typs für das Objekt festgelegt hat, wird die Setroutine:
      • Fügt den neu zugewiesenen Kontext an das Objekt an.
      • Erhöht die Referenzanzahl.
    • Andernfalls, wenn der Minifilter bereits einen Kontext festgelegt hat, die Setroutine:
      • Gibt STATUS_FLT_CONTEXT_ALREADY_DEFINED zurück (ein NTSTATUS-Fehlercode).
      • Ersetzt nicht den vorhandenen Kontext.
      • Erhöht nicht die Referenzanzahl.
      • Speichert einen Zeiger auf den vorhandenen Kontext im OldContext-Parameter, wenn er nicht NULL ist. Wenn dieser Zeiger nicht mehr benötigt wird, muss der Minifiltertreiber ihn durch Aufrufen von FltReleaseContext freigeben.
  • If Operation == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:

    • Die Setroutine fügt immer den neuen Kontext an das Objekt an.
    • Wenn der Minifiltertreiber bereits einen Kontext festgelegt hat, wird die set-Routine:
      • Löscht den vorhandenen Kontext, legt den neuen Kontext fest und erhöht die Verweisanzahl für den neuen Kontext.
      • Wenn der OldContext-Parameter ungleich NULL ist, empfängt er einen Zeiger auf den gelöschten Kontext. Wenn dieser Zeiger nicht mehr benötigt wird, muss der Minifiltertreiber ihn durch Aufrufen von FltReleaseContext freigeben.

Nachdem ein Kontexttyp festgelegt wurde, kann ein Minifilter während der nachfolgenden E/A-Vorgänge einen Kontext abrufen, um zu bestimmen, ob er eine Aktion ausführen muss.

Jeder erfolgreiche Kontextsatz muss schließlich gelöscht werden.

Im folgenden Codebeispiel aus dem CTX-Beispiel-Minifilter erstellt und legt die CtxInstanceSetup-Routine einen Instanzkontext fest:

status = FltAllocateContext(
           FltObjects->Filter,              //in: Filter
           FLT_INSTANCE_CONTEXT,            //in: ContextType
           CTX_INSTANCE_CONTEXT_SIZE,       //in: ContextSize
           NonPagedPool,                    //in: PoolType
           &instanceContext);               //out: ReturnedContext
...
status = FltSetInstanceContext(
           FltObjects->Instance,            //in: Instance
           FLT_SET_CONTEXT_KEEP_IF_EXISTS,  //in: Operation
           instanceContext,                 //in: NewContext
           NULL);                           //out: OldContext

if (instanceContext != NULL) {
  FltReleaseContext(instanceContext);
}
return status;

Beachten Sie, dass nach dem Aufruf von FltSetInstanceContext ein Aufruf von FltReleaseContext vorhanden ist, um die von FltAllocateContext (nicht FltSetInstanceContext) festgelegte Referenzanzahl freizugeben. Dies wird in der Freigabe von Kontexten erläutert.