PFLT_PRE_OPERATION_CALLBACK funzione di callback (fltkernel.h)

Una routine di PFLT_PRE_OPERATION_CALLBACK del driver minifilter esegue l'elaborazione pre-operazione per le operazioni di I/O.

Sintassi

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

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 struttura di FLT_RELATED_OBJECTS contenente puntatori opachi per gli oggetti correlati alla richiesta di I/O corrente.

[out] CompletionContext

Se questa routine di callback restituisce FLT_PREOP_SUCCESS_WITH_CALLBACK o FLT_PREOP_SYNCHRONIZE, questo parametro è un puntatore di contesto facoltativo da passare alla routine di callback post-operazione corrispondente. In caso contrario, deve essere NULL.

Valore restituito

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

Codice restituito Descrizione
FLT_PREOP_COMPLETE Il driver minifilter sta completando l'operazione di I/O. Il gestore filtri non invia l'operazione di I/O a alcun driver minifilter sotto il chiamante nello stack di driver o nel file system. In questo caso, il gestore filtri chiama solo le routine di callback post-operazione dei driver minifilter sopra il chiamante nello stack di driver.
FLT_PREOP_DISALLOW_FASTIO L'operazione è un'operazione di I/O rapida e il driver minifilter non consente l'uso del percorso di I/O rapido per questa operazione. Il gestore filtri non invia l'operazione di I/O veloce a alcun driver minifilter sotto il chiamante nello stack di driver o nel file system. In questo caso, il gestore filtri chiama solo le routine di callback post-operazione dei driver minifilter sopra il chiamante nello stack di driver.
FLT_PREOP_PENDING Il driver minifilter ha pennato l'operazione di I/O e l'operazione è ancora in sospeso. La gestione filtri non elabora ulteriormente l'operazione di I/O fino a quando il driver minifilter chiama FltCompletePendedPreOperation.
FLT_PREOP_SUCCESS_NO_CALLBACK Il driver minifilter restituisce l'operazione di I/O al gestore filtri per un'ulteriore elaborazione. In questo caso, il gestore filtri non chiama il callback post-operazione del driver minifilter, se presente, durante il completamento di I/O.
FLT_PREOP_SUCCESS_WITH_CALLBACK Il driver minifilter restituisce l'operazione di I/O al gestore filtri per un'ulteriore elaborazione. In questo caso, il gestore filtri chiama il callback post-operazione del driver minifilter durante il completamento dell'I/O.
FLT_PREOP_SYNCHRONIZE Il driver minifilter restituisce l'operazione di I/O al gestore filtri per un'ulteriore elaborazione, ma non completa l'operazione. In questo caso, la gestione filtri chiama il callback post-operazione del minifilter nel contesto del thread corrente in IRQL <= APC_LEVEL.
FLT_PREOP_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 di un minifilter driver elabora uno o più tipi di operazioni di I/O. Questa routine di callback è simile a una routine di invio nel modello di filtro legacy.

Un driver minifilter registra una routine di callback pre-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 pre-operazione per un determinato tipo di operazione di I/O senza registrare una routine di callback post-operazione (PFLT_POST_OPERATION_CALLBACK) e viceversa.

Se questa routine restituisce FLT_PREOP_COMPLETE, deve impostare il campo IoStatus.Status della struttura dei dati di callback sul valore NTSTATUS finale per l'operazione di I/O. Impossibile STATUS_PENDING questo valore NTSTATUS. Per un'operazione di pulizia o chiusura, deve essere un valore NTSTATUS riuscito diverso da STATUS_PENDING perché le operazioni di pulizia e chiusura non possono riuscire.

Se questa routine restituisce FLT_PREOP_DISALLOW_FASTIO, non deve impostare il campo IoStatus.Status della struttura dei dati di callback perché la gestione filtri imposta automaticamente questo campo su STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO può essere restituito solo per un'operazione di I/O veloce. Per determinare se una determinata struttura di dati di callback rappresenta un'operazione di I/O rapida, usare la macro FLT_IS_FASTIO_OPERATION .

FLT_PREOP_PENDING può essere restituito solo per le operazioni di I/O basate su IRP perché solo le operazioni di I/O basate su IRP possono essere pennate. 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 .

Se una routine di callback di pre-operazione del driver minifilter restituisce FLT_PREOP_SYNCHRONIZE, il driver minifilter deve aver registrato un callback post-operazione corrispondente per l'operazione.

FLT_PREOP_SYNCHRONIZE deve essere restituito solo per le operazioni di I/O basate su IRP. Se viene restituito per un'operazione di I/O che non è un'operazione basata su IRP, la gestione filtri considera questo valore restituito come se fosse FLT_PREOP_SUCCESS_WITH_CALLBACK.

I driver minifilter non devono restituire FLT_PREOP_SYNCHRONIZE per le operazioni di creazione, perché queste operazioni sono già sincronizzate dalla gestione filtri.

I driver minifilter non devono mai restituire FLT_PREOP_SYNCHRONIZE per operazioni di lettura e scrittura asincrone. In questo modo, può danneggiare gravemente sia il driver minifilter che le prestazioni del sistema.

Una routine di callback di un driver minifilter o post-operazione può modificare il contenuto della struttura dei dati di callback per l'operazione. In caso affermativo, deve quindi chiamare FltSetCallbackDataDirty, a meno che non sia stato modificato il contenuto del campo IoStatus della struttura dei dati di callback.

IrQL per questa routine di callback generica dipende dai percorsi I/O specifici.

File system arrotondare le operazioni di scrittura e lettura alla fine del file fino a un numero multiplo delle dimensioni del settore del dispositivo di archiviazione file sottostante. Quando si elaborano operazioni pre-lettura o pre-scrittura, i filtri che allocano e scambiano buffer devono arrotondare le dimensioni di un buffer allocato fino a un multiplo delle dimensioni del settore del dispositivo associato. In caso contrario, la lunghezza dei dati trasferiti dal file system sottostante supererà la lunghezza allocata del buffer. Per altre informazioni sullo scambio di buffer, vedere l'esempio di swapBuffers Minifilters.

A partire da Windows 8, CompletionContext usa l'annotazione Flt_CompletionContext_Outptr che definisce valori di contesto validi in base al risultato dell'operazione. Di seguito è riportato un esempio di utilizzo per il callback con l'annotazione per CompletionContext.

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Requisiti

   
Client minimo supportato Aggiornamento cumulativo di Microsoft Windows 2000 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

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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr