Condividi tramite


Registrazione dei tipi di contesto

Un driver minifilter deve prima registrare ogni tipo di contesto usato. Dopo che un minifilter ha registrato i tipi di contesto usati, può creare un contesto.

Passaggi per registrare un tipo di contesto

Un minifiltro chiama FltRegisterFilter dalla routine DriverEntry per registrare ogni tipo di contesto usato. Prima di chiamare FltRegisterFilter, il driver minifilter esegue le operazioni seguenti:

  • Crea una matrice a lunghezza variabile di strutture FLT_CONTEXT_REGISTRATION . L'ordine degli elementi in questa matrice non è rilevante; Tuttavia, l'ultimo elemento nella matrice deve essere {FLT_CONTEXT_END}.
  • Archivia un puntatore alla matrice creata nel membro ContextRegistration della struttura FLT_REGISTRATION . Il minifilter passa questa struttura nel parametro Registration di FltRegisterFilter.

Per ogni tipo di contesto usato dal driver minifilter, deve fornire almeno una definizione di contesto. La definizione è sotto forma di una struttura FLT_CONTEXT_REGISTRATION , in cui ogni struttura definisce il tipo, le dimensioni e altre informazioni per il contesto.

Quando il driver minifilter chiama FltAllocateContext per creare un nuovo contesto, il gestore filtri usa il parametro Size , nonché i membri Size e Flags della struttura FLT_CONTEXT_REGISTRATION, per selezionare la definizione del contesto da usare:

  • Per i contesti a dimensione fissa, il membro Size della struttura FLT_CONTEXT_REGISTRATION specifica le dimensioni, in byte, della parte della struttura di contesto definita dal driver minifilter. Le dimensioni massime per un contesto sono MAXUSHORT (64 KB). Zero è un valore di dimensione valido. Gestione filtri implementa contesti a dimensione fissa usando elenchi lookaside. Il gestore filtri crea due elenchi lookaside per ogni valore di dimensione: una paginata e una non di paging.

  • Per i contesti a dimensione variabile, il membro Size deve essere impostato su FLT_VARIABLE_SIZED_CONTEXTS. Gestione filtri alloca i contesti di dimensioni variabili direttamente dal pool di paging o non di paging.

Nel membro Flags della struttura FLT_CONTEXT_REGISTRATION è possibile specificare il flag FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH. Se il driver minifilter utilizza contesti a dimensione fissa e questo flag viene specificato, gestione filtri alloca un contesto dall'elenco lookaside se le dimensioni del contesto sono maggiori o uguali alle dimensioni richieste. In caso contrario, le dimensioni del contesto devono essere uguali alle dimensioni richieste.

Per un determinato tipo di contesto, il driver minifilter può fornire fino a tre definizioni di contesto a dimensione fissa, ognuna con dimensioni diverse e una definizione di dimensione variabile. Per altre informazioni, vedere FLT_CONTEXT_REGISTRATION.

Routine di callback minifilter per la gestione del contesto

Il driver minifilter può facoltativamente fornire le routine di callback correlate al contesto seguenti, archiviate nella struttura FLT_REGISTRATION passata come parametro a FltRegisterFilter:

Routine di callback Descrizione
PFLT_CONTEXT_ALLOCATE_CALLBACK In rarissime occasioni, un minifilter potrebbe dover definire la propria routine di callback per allocare contesti, invece di basarsi sul gestore filtri.
PFLT_CONTEXT_CLEANUP_CALLBACK Routine di pulizia di un minifilter da chiamare prima che il contesto venga liberato.
PFLT_CONTEXT_FREE_CALLBACK In rarissime occasioni, un minifilter potrebbe dover definire la propria routine di callback per liberare contesti, invece di basarsi sul gestore filtri.

Esempio di codice di registrazione del contesto

L'esempio di codice seguente, tratto dal driver minifilter di esempio CTX, mostra una matrice di strutture FLT_CONTEXT_REGISTRATION usate per registrare contesti di istanza, file, flusso e oggetto file (handle di flusso).

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};