Condividi tramite


PFLT_POST_OPERATION_CALLBACK funzione di callback (fltkernel.h)

Un driver minifiltro 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 alla struttura dei dati di callback FLT_CALLBACK_DATA per l'operazione di I/O.

[in] FltObjects

Puntatore a una gestione filtri gestita FLT_RELATED_OBJECTS struttura che contiene puntatori opachi per gli oggetti correlati alla richiesta di I/O corrente.

[in, optional] CompletionContext

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

[in] Flags

Maschera di bit di flag che specifica la modalità di esecuzione del callback post-operazione.

Bandiera Significato
FLTFL_POST_OPERATION_DRAINING Gestione filtri imposta questo flag per indicare che l'istanza del driver minifilter viene scollegata e che viene chiamata questa routine di callback post-operazione 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 terminato 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 di un driver minifilter può restituire questo valore di stato solo se il callback post-operazione del driver minifilter ha inviato l'operazione di I/O a una coda di lavoro. Il driver minifilter deve infine riprendere l'elaborazione del 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 del completamento dell'operazione di I/O, a meno che non siano soddisfatte entrambe le condizioni seguenti:

  • Il callback post-operazione ha inviato l'operazione di I/O a 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 al gestore 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, utilizzare la macro FLT_IS_IRP_OPERATION.
FLT_POSTOP_DISALLOW_FSFILTER_IO
Il driver minifiltro non consente un'operazione QueryOpen veloce e forza l'operazione verso il basso nel percorso lento. In questo modo, gestione I/O esegue la manutenzione della richiesta eseguendo una query o una chiusura del file. I driver minifiltro devono restituire questo stato solo per QueryOpen.

Osservazioni

La routine di callback post-operazione di un driver 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 runtime di integrazione inferiore.
  • Qualsiasi struttura di dati utilizzata in questa routine deve essere allocata da un pool non di paging.
  • Non può essere reso pageable.
  • 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. Al contrario, deve essere inserito 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 FLTFL_POST_OPERATION_DRAINING bit impostato. Di seguito sono riportate le eccezioni a questa regola:

  • Se la routine di callback preoperazione di un driver minifiltro 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 preoperativo.
  • È garantito che le routine di callback post-creazione vengano chiamate in irQL PASSIVE_LEVEL, nel contesto del thread che ha originato 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 OperationRegistration matrice 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 preoperazione (PFLT_PRE_OPERATION_CALLBACK) e viceversa.

Fabbisogno

Requisito Valore
client minimo supportato Disponibile in Microsoft Windows 2000 Update Rollup 1 per SP4, Windows XP SP2, Windows Server 2003 SP1 e sistemi operativi Windows successivi.
piattaforma di destinazione Desktop
intestazione fltkernel.h (include FltKernel.h)
IRQL Vedere la sezione Osservazioni

Vedere 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