Condividi tramite


Modifica dei parametri per un'operazione di I/O

Un driver minifilter può modificare i parametri per un'operazione di I/O. Ad esempio, una routine di callback di preoperazione di un driver minifilter può reindirizzare un'operazione di I/O a un volume diverso modificando l'istanza di destinazione per l'operazione. La nuova istanza di destinazione deve essere un'istanza dello stesso driver minifilter con la stessa altitudine in un altro volume.

I parametri per un'operazione di I/O si trovano nella struttura dei dati di callback (FLT_CALLBACK_DATA) e nella struttura del blocco di parametri I/O (FLT_IO_PARAMETER_BLOCK) per l'operazione. La routine di callback di preoperazione del driver minifilter e la routine di callback di post-intervento ricevono un puntatore alla struttura dei dati di callback per l'operazione nel parametro Di input dati . Il membro Iopb della struttura dei dati di callback è un puntatore a una struttura di blocchi di parametri I/O che contiene i parametri per l'operazione.

Se una routine di callback di preoperazione di un driver minifilter modifica i parametri per un'operazione di I/O, tutti i driver minifilter seguenti che il driver minifilter nello stack di istanze del driver minifilter riceverà i parametri modificati nelle routine di callback di preoperazione e post-esecuzione.

I parametri modificati non vengono ricevuti dalla routine di callback postperation del driver minifilter corrente o da eventuali driver minifilter sopra indicati in tale driver minifilter nello stack di istanze del driver minifilter. In tutte le situazioni, le routine di callback di preoperazione e postoperazione di un driver minifilter ricevono gli stessi valori dei parametri di input per una determinata operazione di I/O.

Dopo aver modificato i parametri per un'operazione di I/O, la routine di callback di preoperazione o postoperazione deve indicare che l'operazione è stata eseguita chiamando FltSetCallbackDataDirty, a meno che non abbia modificato il contenuto del campo IoStatus della struttura dei dati di callback. In caso contrario, gestione filtri ignorerà le modifiche apportate ai valori dei parametri. FltSetCallbackDataDirty imposta il flag FLTFL_CALLBACK_DATA_DIRTY nella struttura dei dati di callback per l'operazione di I/O. I driver minifilter possono testare questo flag chiamando FltIsCallbackDataDirty o cancellarlo chiamando FltClearCallbackDataDirty.

Se una routine di callback di preoperazione di un driver minifilter modifica i parametri per un'operazione di I/O, tutti i driver minifilter sottostanti che il driver minifilter nello stack di istanze del driver minifilter riceverà i parametri modificati nei parametri di input Data e FltObjects per le routine di callback di preoperazione e postoperazione. I driver minifilter non possono modificare direttamente il contenuto della struttura FLT_RELATED_OBJECTS a cui punta il parametro FltObjects . Tuttavia, se un driver minifilter modifica l'istanza di destinazione o l'oggetto file di destinazione per un'operazione di I/O, il gestore filtri modifica il valore del membro Instance o FileObject corrispondente della struttura FLT_RELATED_OBJECTS passata ai driver minifilter inferiori.

Anche se qualsiasi modifica di parametro apportata dalla routine di callback di preoperazione di un driver minifilter non viene ricevuta dalla routine di callback di post-esecuzione del driver minifilter, una routine di callback di preoperazione è in grado di passare informazioni sui parametri modificati alla routine di callback di post-esecuzione del driver minifilter. Se la routine di callback di preoperazione passa l'operazione di I/O verso il basso nello stack restituendo FLT_PREOP_SUCCESS_WITH_CALLBACK o FLT_PREOP_SYNCHRONIZE, può archiviare informazioni sui valori dei parametri modificati in una struttura definita dal driver minifilter a cui punta il parametro di output CompletionContext . Il gestore filtri passa questo puntatore alla struttura nel parametro di input CompletionContext alla routine di callback di post-esecuzione.

Per altre informazioni sui parametri per un'operazione di I/O, vedere FLT_CALLBACK_DATA e FLT_IO_PARAMETER_BLOCK.