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