Condividi tramite


PFLT_PRE_OPERATION_CALLBACK funzione di callback (fltkernel.h)

La routine PFLT_PRE_OPERATION_CALLBACK di un driver minifilter esegue l'elaborazione preliminare delle 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 FLT_RELATED_OBJECTS che contiene 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 minifiltro sta completando l'operazione di I/O. Per ulteriori informazioni, vedere Note.
FLT_PREOP_DISALLOW_FASTIO L'operazione è un'operazione di I/O veloce e il minifilter non consente l'uso del percorso di I/O veloce per questa operazione. Per ulteriori informazioni, vedere Note.
FLT_PREOP_PENDING Il minifilter ha pennato l'operazione di I/O e l'operazione è ancora in sospeso. Per ulteriori informazioni, vedere Note.
FLT_PREOP_SUCCESS_NO_CALLBACK Il minifilter restituisce l'operazione di I/O a FltMgr per un'ulteriore elaborazione. In questo caso , FltMgr non chiamerà il callback post-operazione del driver minifilter, se presente, durante il completamento di I/O.
FLT_PREOP_SUCCESS_WITH_CALLBACK Il minifilter restituisce l'operazione di I/O a FltMgr per un'ulteriore elaborazione. In questo caso , FltMgr chiama il callback post-operazione del minifilter durante il completamento di I/O.
FLT_PREOP_SYNCHRONIZE Il minifilter restituisce l'operazione di I/O a FltMgr per un'ulteriore elaborazione, ma non completa l'operazione. Per ulteriori informazioni, vedere Note.
FLT_PREOP_DISALLOW_FSFILTER_IO Il minifilter non consente un'operazione QueryOpen veloce e forza l'operazione verso il basso nel percorso lento. In questo modo, il gestore di I/O esegue la richiesta eseguendo una query/chiusura aperta/chiusa del file. I driver minifilter devono restituire questo stato solo per QueryOpen.

Commenti

Per altre informazioni, vedere Scrittura di routine di callback preoperazioni .

La routine di callback di pre-operazione di un minifilter elabora uno o più tipi di operazioni di I/O. Questa routine di callback è simile a una routine dispatch nel modello di filtro legacy.

Un minifilter registra una routine di callback preoperatoria 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 minifilter passa questa struttura come parametro a FltRegisterFilter nella routine DriverEntry . Un minifilter può registrare una routine di callback preoperazione per un determinato tipo di operazione di I/O senza registrare una routine di callback post-operazione (PFLT_POST_OPERATION_CALLBACK) e viceversa.

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

Il runtime di integrazione per questa routine di callback generica dipende dai relativi percorsi di I/O specifici. È possibile chiamare KeGetCurrentIRQL in modo rapido ed economico se è necessario conoscere l'IRQL corrente. Per altre informazioni su IRQL, vedere Scrittura di routine di callback di preoperazione .

I file system arrotondano le operazioni di scrittura e lettura alla fine del file in un multiplo delle dimensioni del settore del dispositivo di archiviazione file sottostante. Quando si elaborano operazioni di pre-lettura o pre-scrittura, i filtri che allocano e scambiano i 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 minifilter SwapBuffers.

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
    );


Restituzione di FLT_PREOP_COMPLETE

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. Questo valore NTSTATUS non può essere STATUS_PENDING. 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 avere esito negativo.

Quando questa routine restituisce FLT_PREOP_COMPLETE, FltMgr non invierà l'operazione di I/O ad alcun driver minifilter sotto il chiamante nello stack di driver o al file system. In questo caso , FltMgr chiama solo le routine di callback post-operazione dei driver minifilter sopra il chiamante nello stack di driver.

Restituzione di FLT_PREOP_DISALLOW_FASTIO

Se questa routine restituisce FLT_PREOP_DISALLOW_FASTIO, non deve impostare il campo IoStatus.Status della struttura dei dati di callback perché FltMgr 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 veloce, utilizzare la macro FLT_IS_FASTIO_OPERATION .

Quando questa routine restituisce FLT_PREOP_DISALLOW_FASTIO, FltMgr non invierà l'operazione di I/O veloce ad alcun driver minifilter sotto il chiamante nello stack di driver o al file system. In questo caso , FltMgr chiama solo le routine di callback post-operazione dei driver minifilter sopra il chiamante nello stack di driver.

Restituzione di FLT_PREOP_PENDING

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

Quando questa routine restituisce FLT_PREOP_PENDING, FltMgr non elabora ulteriormente l'operazione di I/O finché il driver minifilter chiama FltCompletePendedPreOperation.

Restituzione di FLT_PREOP_SYNCHRONIZE

Se la routine di callback di pre-operazione di un minifilter restituisce FLT_PREOP_SYNCHRONIZE, il minifilter deve avere registrato un callback post-operazione corrispondente per l'operazione. Quando questa routine restituisce FLT_PREOP_SYNCHRONIZE, FltMgr chiama il callback post-operazione del minifilter nel contesto del thread corrente in IRQL <= APC_LEVEL.

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, FltMgr 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 da FltMgr.

I minifiltri non devono mai restituire FLT_PREOP_SYNCHRONIZE per le operazioni di lettura e scrittura asincrone. In questo modo è possibile ridurre gravemente sia le prestazioni del driver minifilter che delle prestazioni del sistema.

Requisiti

Requisito Valore
Client minimo supportato 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

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

KeGetCurrentIRQL