PFLT_POST_OPERATION_CALLBACK funzione di callback (fltkernel.h)

Un driver minifilter può registrare una o più routine di tipo PFLT_POST_OPERATION_CALLBACK per eseguire l'elaborazione del completamento per le operazioni di I/O.

Sintassi

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

Parametri

[in, out] Data

Puntatore ai dati di callback FLT_CALLBACK_DATA struttura per l'operazione di I/O.

[in] FltObjects

Puntatore a un gestore filtri gestito FLT_RELATED_OBJECTS struttura contenente puntatori opachi per gli oggetti correlati alla richiesta di I/O corrente.

[in, optional] CompletionContext

Puntatore di contesto restituito dalla routine di callback del driver minifilter PFLT_PRE_OPERATION_CALLBACK routine. Il puntatore CompletionContext consente di comunicare informazioni dalla routine di callback pre-operazione alla routine di callback post-operazione.

[in] Flags

Maschera di flag che specifica come eseguire il callback post-operazione.

Contrassegno Significato
FLTFL_POST_OPERATION_DRAINING Gestione filtri imposta questo flag per indicare che l'istanza del driver minifilter viene scollegata e che questa routine di callback post-operazione viene chiamata per pulire il contesto di completamento del driver minifilter. Il callback post-operazione deve restituire FLT_POSTOP_FINISHED_PROCESSING. Se questo flag è impostato, il parametro Data punta a una copia della struttura di dati di callback originale per l'operazione, non alla struttura dei dati di callback originale. Inoltre, quando questo flag è impostato, la routine di callback post-operazione viene chiamata in IRQL <= APC_LEVEL.

Valore restituito

Questa routine di callback restituisce uno dei valori di stato seguenti:

Codice restituito Descrizione
FLT_POSTOP_FINISHED_PROCESSING
Il driver minifilter ha completato l'elaborazione del completamento per l'operazione di I/O e restituisce il controllo dell'operazione al gestore filtri.

Dopo che il callback post-operazione restituisce questo valore di stato, la gestione filtri continua l'elaborazione dell'operazione di I/O.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
Il driver minifilter ha interrotto l'elaborazione del completamento per l'operazione di I/O, ma non restituisce il controllo dell'operazione al gestore filtri.

Il callback post-operazione del driver minifilter può restituire questo valore di stato solo se il callback post-operazione del driver minifilter ha pubblicato l'operazione di I/O in una coda di lavoro. Il driver minifilter deve infine riprendere l'elaborazione di completamento dell'operazione di I/O.

Dopo che il callback post-operazione restituisce FLT_POSTOP_MORE_PROCESSING_REQUIRED, la gestione filtri non esegue un'ulteriore elaborazione di completamento dell'operazione di I/O, a meno che non siano vere entrambe le condizioni seguenti:

  • Il callback post-operazione ha pubblicato l'operazione di I/O in una coda di lavoro.
  • Dopo che la routine di lavoro esegue l'elaborazione del completamento per l'operazione, chiama FltCompletePendedPostOperation per restituire il controllo dell'operazione alla gestione filtri.
Questo valore di stato può essere restituito solo per le operazioni di I/O basate su IRP. Per determinare se una determinata struttura di dati di callback rappresenta un'operazione di I/O basata su IRP, usare la macro FLT_IS_IRP_OPERATION .
FLT_POSTOP_DISALLOW_FSFILTER_IO
Il driver minifilter non consente un'operazione queryOpen veloce e forza l'operazione verso il basso il percorso lento. In questo modo, la gestione I/O esegue la richiesta eseguendo una richiesta aperta/query/chiusura del file. I driver minifilter devono restituire questo stato solo per QueryOpen.

Commenti

Una routine di callback post-operazione di minifilter esegue l'elaborazione del completamento per uno o più tipi di operazioni di I/O.

Le routine di callback post-operazione sono simili alle routine di completamento usate dai driver di filtro del file system legacy.

Le routine di callback post-operazione vengono chiamate in un contesto di thread arbitrario, in IRQL <= DISPATCH_LEVEL. Poiché questa routine di callback può essere chiamata in IRQL DISPATCH_LEVEL, è soggetta ai vincoli seguenti:

  • Non può chiamare in modo sicuro qualsiasi routine in modalità kernel che deve essere eseguita in un irQL inferiore.
  • Qualsiasi struttura di dati usata in questa routine deve essere allocata dal pool non di pagine.
  • Non può essere reso paginabile.
  • Non può acquisire risorse, mutex o mutex veloci. Tuttavia, può acquisire blocchi di rotazione.
  • Non può ottenere, impostare o eliminare contesti, ma può rilasciare contesti.

Qualsiasi elaborazione di completamento di I/O che deve essere eseguita in IRQL < DISPATCH_LEVEL non può essere eseguita direttamente nella routine di callback di postperazione. Deve invece essere pubblicato in una coda di lavoro chiamando una routine come FltDoCompletionProcessingWhenSafe o FltQueueDeferredIoWorkItem.

Tenere presente che FltDoCompletionProcessingWhenSafe non deve mai essere chiamato se il parametro Flags del callback post-operazione ha il set di bit FLTFL_POST_OPERATION_DRAINING. Di seguito sono riportate eccezioni a questa regola:

  • Se una routine di callback pre-operazione di un minifilter driver restituisce FLT_PREOP_SYNCHRONIZE per un'operazione di I/O basata su IRP, la routine di callback post-operazione corrispondente viene chiamata in IRQL <= APC_LEVEL, nello stesso contesto del thread del callback pre-operazione.
  • Le routine di callback post-create vengono chiamate in irQL PASSIVE_LEVEL, nel contesto del thread che ha generato l'operazione di IRP_MJ_CREATE.

Un driver minifilter registra una routine di callback post-operazione per un particolare tipo di operazione di I/O archiviando il punto di ingresso della routine di callback nella matrice OperationRegistration della struttura FLT_REGISTRATION . Il driver minifilter passa questa struttura come parametro a FltRegisterFilter nella routine DriverEntry .

Un driver minifilter può registrare una routine di callback post-operazione per un particolare tipo di operazione di I/O senza registrare una routine di callback pre-operazione (PFLT_PRE_OPERATION_CALLBACK) e viceversa.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Microsoft Windows 2000 Update Rollup 1 for SP4, Windows XP SP2, Windows Server 2003 SP1 e versioni successive dei sistemi operativi Windows.
Piattaforma di destinazione Desktop
Intestazione fltkernel.h (include FltKernel.h)
IRQL Vedere La sezione Osservazioni

Vedi anche

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK