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 |
---|---|
|
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. |
|
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 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
FltCompletePendedPostOperation