Condividi tramite


Funzione FltAllocateContext (fltkernel.h)

La routine FltAllocateContext alloca una struttura di contesto per un tipo di contesto specificato.

Sintassi

NTSTATUS FLTAPI FltAllocateContext(
  [in]  PFLT_FILTER      Filter,
  [in]  FLT_CONTEXT_TYPE ContextType,
  [in]  SIZE_T           ContextSize,
  [in]  POOL_TYPE        PoolType,
  [out] PFLT_CONTEXT     *ReturnedContext
);

Parametri

[in] Filter

Puntatore di filtro opaco per il chiamante. Questo parametro è obbligatorio e non può essere NULL.

[in] ContextType

Valore FLT_CONTEXT_TYPE che indica il tipo di contesto da allocare. ContextType può essere uno dei seguenti:

Valore Significato
FLT_VOLUME_CONTEXT (0x0001) Allocare un contesto di volume.
FLT_INSTANCE_CONTEXT (0x0002) Allocare un contesto di istanza.
FLT_FILE_CONTEXT (0x0004) Allocare un contesto di file.
FLT_STREAM_CONTEXT (0x0008) Allocare un contesto di flusso.
FLT_STREAMHANDLE_CONTEXT (0x0010) Allocare un contesto di handle di flusso.
FLT_TRANSACTION_CONTEXT (0x0020) Allocare un contesto di transazione.
FLT_SECTION_CONTEXT (0x0040) Allocare un contesto di sezione. Disponibile a partire da Windows 8.

[in] ContextSize

Dimensioni, in byte, della parte del contesto definito dal driver minifilter. Deve essere maggiore di zero e minore o uguale a MAXUSHORT; per i contesti a dimensioni fisse, deve essere minore o uguale alla dimensione specificata nella struttura FLT_CONTEXT_REGISTRATION . Un minifilter usa questa parte del contesto per mantenere le informazioni di contesto specifiche per se stesso. FltMgr considera questa parte della struttura del contesto come opaca. Questo parametro è obbligatorio e non può essere zero.

[in] PoolType

Tipo di pool da allocare. Questo parametro è obbligatorio e deve essere uno dei seguenti. Per una descrizione dettagliata di ogni tipo, vedere POOL_TYPE . Per ulteriori informazioni, vedere la sezione Osservazioni.

Valore Significato
NonPagedPool Memoria di sistema non modificabile. PoolType deve essere NonPagedPool se ContextType è FLT_VOLUME_CONTEXT.
PagedPool Memoria di sistema paginabile.
NonPagedPoolNx Pool non a pagina (NX) non eseguito.

[out] ReturnedContext

Puntatore a una variabile allocata dal chiamante che riceve l'indirizzo del contesto appena allocato. Il chiamante è responsabile della chiamata a FltReleaseContext per rilasciare questo contesto quando non è più necessario.

Valore restituito

FltAllocateContext restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio uno dei seguenti:

Codice restituito Descrizione
STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND Le informazioni di allocazione per il contesto del tipo specificato non sono state fornite al momento della registrazione del filtro. OR, per i contesti a dimensione fissa, contextSize richiesto è maggiore della dimensione specificata nella struttura FLT_CONTEXT_REGISTRATION per il contextType specificato.
STATUS_FLT_DELETING_OBJECT Il driver minifilter specificato nel parametro Filter viene eliminato. Si tratta di un codice di errore.
STATUS_INSUFFICIENT_RESOURCES FltAllocateContext ha rilevato un errore di allocazione del pool. Si tratta di un codice di errore.
STATUS_INVALID_BUFFER_SIZE ContextSize non può essere maggiore di MAXUSHORT. Si tratta di un codice di errore.
STATUS_INVALID_PARAMETER È stato specificato un valore non valido per ContextType o il parametro ContextSize . Si tratta di un codice di errore.
STATUS_NOT_SUPPORTED Il file system non supporta contesti per flusso. Si tratta di un codice di errore.

Commenti

Per altre informazioni sui contesti, vedere Informazioni sui contesti minifilter.

FltAllocateContext alloca un contesto del tipo specificato dal pool specificato. A partire da Windows 11, se la memoria che RestituiscedContext punta a è zero dipende dal seguente:

  • La memoria è garantita zero per i contesti di dimensione variabile.
  • Il contenuto della memoria è definito dall'implementazione per contesti di dimensioni fisse allocati da una funzione di callback fornita dal chiamante.
  • In caso contrario, la memoria non può essere considerata zero per contesti di dimensioni fisse a causa del comportamento dell'elenco lookaside. Vale a dire, una voce restituita dall'elenco lookaside potrebbe non essere zero se è memoria liberata in precedenza all'elenco lookaside anziché a una nuova allocazione.

Prima di Windows 11, il contenuto del contesto restituito non viene zero.

L'impostazione di PoolType su un valore non valido può comportare un comportamento imprevisto, ad esempio causando il bypass degli elenchi lookaside, causando la perdita dei vantaggi delle prestazioni degli elenchi lookaside. Per i contesti con una funzione di callback ContextAllocateCallback , il comportamento dovuto a un pooltype non valido dipende dall'implementazione.

Dopo aver allocato il contesto, può essere impostato su un oggetto passando il puntatore ReturnedContext alla routine set-context appropriata dalla tabella seguente.

Tipo di contesto routine Set-Context
FLT_FILE_CONTEXT FltSetFileContext (a partire da Windows Vista)
FLT_INSTANCE_CONTEXT FltSetInstanceContext
FLT_SECTION_CONTEXT FltCreateSectionForDataScan (a partire da Windows 8)
FLT_STREAM_CONTEXT FltSetStreamContext
FLT_STREAMHANDLE_CONTEXT FltSetStreamHandleContext
FLT_TRANSACTION_CONTEXT FltSetTransactionContext (a partire da Windows Vista)
FLT_VOLUME_CONTEXT FltSetVolumeContext

Quando un driver minifilter chiama FltRegisterFilter dalla routine DriverEntry , deve registrare ogni tipo di contesto usato. Per altre informazioni, vedere la voce di riferimento per la struttura FLT_CONTEXT_REGISTRATION e Registrazione dei tipi di contesto.

FltAllocateContext non inizializza il contenuto della parte della struttura di contesto specifica per il driver minifilter.

Per ottenere il contesto per un oggetto, chiamare FltGetContexts o la routine get-context appropriata dalla tabella seguente.

Tipo di contesto routine Get-Context
FLT_FILE_CONTEXT FltGetFileContext (a partire da Windows Vista)
FLT_INSTANCE_CONTEXT FltGetInstanceContext
FLT_SECTION_CONTEXT FltGetSectionContext (a partire da Windows 8)
FLT_STREAM_CONTEXT FltGetStreamContext
FLT_STREAMHANDLE_CONTEXT FltGetStreamHandleContext
FLT_TRANSACTION_CONTEXT FltGetTransactionContext (a partire da Windows Vista )
FLT_VOLUME_CONTEXT FltGetVolumeContext

I contesti vengono conteggiati in base al riferimento e in caso di esito positivo restituito da FltAllocateContext, il contesto a cui punta ReturnedContext è stato inizializzato per avere un conteggio dei riferimenti pari a 1. Un contesto viene liberato automaticamente quando il conteggio dei riferimenti raggiunge zero. Per incrementare il conteggio dei riferimenti in un contesto, chiamare FltReferenceContext.

Per decrementare il conteggio dei riferimenti in un contesto, chiamare FltReleaseContext.

Poiché i contesti sono conteggiati dai riferimenti, non è in genere necessario eliminarli. Per eliminare un contesto in modo esplicito, chiamare FltDeleteContext o la routine di contesto di eliminazione appropriata dalla tabella seguente.

Tipo di contesto routine Delete-Context
FLT_FILE_CONTEXT FltDeleteFileContext (a partire da Windows Vista)
FLT_INSTANCE_CONTEXT FltDeleteInstanceContext
FLT_SECTION_CONTEXT FltCloseSectionForDataScan (a partire da Windows 8)
FLT_STREAM_CONTEXT FltDeleteStreamContext
FLT_STREAMHANDLE_CONTEXT FltDeleteStreamHandleContext
FLT_TRANSACTION_CONTEXT FltDeleteTransactionContext (a partire da Windows Vista)
FLT_VOLUME_CONTEXT FltDeleteVolumeContext

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione fltkernel.h (include Fltkernel.h)
Libreria FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Vedi anche

FLT_CONTEXT_REGISTRATION

FltCloseSectionForDataScan

FltCreateSectionForDataScan

FltDeleteContext

FltDeleteFileContext

FltDeleteInstanceContext

FltDeleteStreamContext

FltDeleteStreamHandleContext

FltDeleteTransactionContext

FltDeleteVolumeContext

FltGetContexts

FltGetFileContext

FltGetInstanceContext

FltGetSectionContext

FltGetStreamContext

FltGetStreamHandleContext

FltGetTransactionContext

FltGetVolumeContext

FltReferenceContext

FltRegisterFilter

FltReleaseContext

FltSetFileContext

FltSetInstanceContext

FltSetStreamContext

FltSetStreamHandleContext

FltSetTransactionContext

FltSetVolumeContext