FLT_IO_PARAMETER_BLOCK struttura (fltkernel.h)
La struttura FLT_IO_PARAMETER_BLOCK contiene i parametri per l'operazione di I/O rappresentata da una struttura di dati di callback FLT_CALLBACK_DATA .
Sintassi
typedef struct _FLT_IO_PARAMETER_BLOCK {
ULONG IrpFlags;
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR OperationFlags;
UCHAR Reserved;
PFILE_OBJECT TargetFileObject;
PFLT_INSTANCE TargetInstance;
FLT_PARAMETERS Parameters;
} FLT_IO_PARAMETER_BLOCK, *PFLT_IO_PARAMETER_BLOCK;
Members
IrpFlags
Maschera di flag che specificano vari aspetti dell'operazione di I/O. Questi flag vengono usati solo per le operazioni basate su IRP. La tabella seguente mostra i valori del flag.
Valore | Significato |
---|---|
IRP_BUFFERED_IO | L'operazione è un'operazione di I/O memorizzata nel buffer. |
IRP_CLOSE_OPERATION | L'operazione è un'operazione di pulizia o chiusura. |
IRP_DEALLOCATE_BUFFER | Gestione I/O libera il buffer durante la fase di completamento per l'IRP. |
IRP_INPUT_OPERATION | L'operazione è un'operazione di input. |
IRP_NOCACHE | L'operazione è un'operazione di I/O non concached. |
IRP_PAGING_IO | L'operazione è un'operazione di I/O di paging. |
IRP_SYNCHRONOUS_API | L'operazione di I/O è sincrona. |
IRP_SYNCHRONOUS_PAGING_IO | L'operazione è un'operazione di I/O sincrona. |
IRP_MOUNT_COMPLETION | Un montaggio del volume viene completato per l'operazione. |
IRP_CREATE_OPERATION | L'operazione è un'operazione di creazione o apertura. |
IRP_READ_OPERATION | L'operazione di I/O è per la lettura. |
IRP_WRITE_OPERATION | L'operazione di I/O è per la scrittura. |
IRP_DEFER_IO_COMPLETION | Il completamento dell'operazione di I/O viene posticipato. |
IRP_ASSOCIATED_IRP | L'operazione è associata a un'IRP master. |
IRP_OB_QUERY_NAME | L'operazione è una query nome asincrona. |
IRP_HOLD_DEVICE_QUEUE | Riservato. |
IRP_UM_DRIVER_INITIATED_IO | L'operazione ha avuto origine da un driver in modalità utente. |
MajorFunction
Codice della funzione principale per l'operazione di I/O. I codici di funzione principali vengono usati per operazioni basate su IRP, operazioni di I/O veloci e callback del file system (FSFilter). Per altre informazioni sulle operazioni aggiuntive, vedere FLT_PARAMETERS.
MinorFunction
Codice di funzione secondario per l'operazione di I/O. Questo membro è facoltativo e può essere NULL. Il valore del membro MajorFunction determina i valori possibili. Per altre informazioni sui codici di funzione secondari, vedere FLT_PARAMETERS.
OperationFlags
Maschera di flag che specificano vari aspetti dell'operazione di I/O. Questi flag vengono usati solo per le operazioni basate su IRP. Filter Manager copia questi flag dal membro Flag della struttura IO_STACK_LOCATION associata all'IRP. La tabella seguente mostra i valori del flag più comunemente usati.
Valore | Significato |
---|---|
SL_CASE_SENSITIVE | Usato per IRP_MJ_CREATE. Se questo flag è impostato, i confronti dei nomi file devono essere distinzione tra maiuscole e minuscole. |
SL_EXCLUSIVE_LOCK | Usato per IRP_MJ_LOCK_CONTROL. Se questo flag è impostato, viene richiesto un blocco di byte-range esclusivo. In caso contrario, viene richiesto un blocco condiviso. |
SL_FAIL_IMMEDIATELY | Usato per IRP_MJ_LOCK_CONTROL. Se questo flag è impostato, la richiesta di blocco deve avere esito negativo se non può essere concessa immediatamente. |
SL_FORCE_ACCESS_CHECK | Usato per IRP_MJ_CREATE. Se questo flag è impostato, i controlli di accesso devono essere eseguiti anche se il valore del membro RequestorMode di IRP è KernelMode. |
SL_FORCE_DIRECT_WRITE | Usato per IRP_MJ_WRITE e IOCTL_DISK_COPY_DATA. Se questo flag è impostato, i driver in modalità kernel possono scrivere in aree del volume normalmente bloccate dalla scrittura a causa di motivi di sicurezza. Questo flag viene controllato sia nel livello dello stack di file system che nello stack di archiviazione. Il flag SL_FORCE_DIRECT_WRITE è disponibile in Windows Vista e versioni successive di Windows. |
SL_INDEX_SPECIFIED | Usato per IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi per directory, quota o informazioni sull'attributo esteso deve iniziare alla voce nell'elenco il cui indice è specificato. |
SL_OPEN_PAGING_FILE | Usato per IRP_MJ_CREATE. Se questo flag è impostato, il file è un file di paging. |
SL_OPEN_TARGET_DIRECTORY | Usato per IRP_MJ_CREATE. Se questo flag è impostato, la directory padre del file deve essere aperta. |
SL_OVERRIDE_VERIFY_VOLUME | Usato per IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_READ e IRP_MJ_WRITE. Se questo flag è impostato, l'operazione di I/O deve essere eseguita anche se il flag di DO_VERIFY_VOLUME è impostato sull'oggetto dispositivo del volume. |
SL_RESTART_SCAN | Usato per IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi delle informazioni sulla directory, la quota o l'attributo esteso devono iniziare alla prima voce della directory o dell'elenco. In caso contrario, l'analisi deve essere ripresa dall'analisi precedente. |
SL_RETURN_SINGLE_ENTRY | Usato per IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi per directory, quota o informazioni sull'attributo esteso deve restituire solo la prima voce trovata. |
SL_WATCH_TREE | Usato per IRP_MJ_DIRECTORY_CONTROL. Se questo flag è impostato, tutte le sottodirectory di questa directory devono essere visualizzate anche. In caso contrario, solo la directory stessa deve essere osservata. |
SL_WRITE_THROUGH | Usato per IRP_MJ_WRITE. Se questo flag è impostato, i dati dei file devono essere scritti tramite l'archiviazione persistente, non solo scritti nella cache. |
Reserved
Riservato per l'utilizzo nel sistema. Non usare.
TargetFileObject
Puntatore a oggetti file per il file o la directory di destinazione per questa operazione di I/O.
TargetInstance
Puntatore opaco dell'istanza per il minifilter destinato a questa operazione di I/O.
Parameters
Struttura FLT_PARAMETERS che contiene i parametri per l'operazione di I/O specificata dai membri MajorFunction e MinorFunction.
Commenti
La struttura FLT_IO_PARAMETER_BLOCK contiene i parametri per l'operazione di I/O rappresentata da una struttura di callback (FLT_CALLBACK_DATA). La struttura dei dati di callback contiene un puntatore alla struttura FLT_IO_PARAMETER_BLOCK nel membro Iopb .
Un minifilter riceve un puntatore alla struttura dei dati di callback come parametro di input Data o CallbackData ai tipi di routine di callback seguenti:
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
Le routine di preoperazione e postoperazione di un minifilter possono modificare il contenuto della struttura di FLT_IO_PARAMETER_BLOCK per l'operazione di I/O, ad eccezione dei membri MajorFunction e Riservati . In caso affermativo, deve chiamare FltSetCallbackDataDirty, a meno che non sia stato modificato anche il membro IoStatus della struttura dei dati di callback per l'operazione. In caso contrario, i valori modificati vengono ignorati.
Quando Filter Manager genera un callback di preoperazione o postoperazione in un minifilter, FltObjects-FileObject> e TargetFileObject (CallbackData-Iopb-TargetFileObject>>) sono inizialmente uguali. Se un minifilter modifica TargetFileObject o TargetInstance, la chiamata successiva a FltSetCallbackDataDirty da un callback di preoperazione causerà la sostituzione di FltObjects-FileObjects-FileObjects-Instance>> prima di inviare l'operazione a filtri inferiori.
Se una routine di callback di preoperazione di un minifilter modifica i parametri per un'operazione di I/O, tutti i minifilter sotto di esso nello stack di istanze minifilter riceveranno i parametri modificati nelle routine di callback preoperazione e postoperazione.
I parametri modificati non vengono ricevuti dalla routine di callback postperazione del minifilter o da qualsiasi minifilter sopra il minifilter nello stack di istanze minifilter. In tutti i casi, le routine di preoperazione e postoperazione di un minifilter ricevono gli stessi valori dei parametri di input.
Se un minifilter modifica il valore del membro TargetInstance , il nuovo valore deve essere un puntatore a un'istanza dello stesso minifilter con la stessa altitudine in un volume diverso. Inoltre, l'oggetto dispositivo del nuovo volume deve avere una dimensione dello stack maggiore o uguale a quella dell'oggetto dispositivo del volume originale.
Per ottenere le dimensioni dello stack per un oggetto dispositivo volume, dato un puntatore di istanza opaca per un'istanza collegata al volume, eseguire le operazioni seguenti:
- Chiamare FltGetVolumeFromInstance per ottenere il puntatore del volume.
- Chiamare FltGetDeviceObject per ottenere un puntatore all'oggetto dispositivo del volume. Questo puntatore viene restituito nel parametro DeviceObject . Le dimensioni dello stack dell'oggetto dispositivo sono disponibili in DeviceObject-StackSize>.
- Quando il puntatore del volume non è più necessario, chiamare FltObjectDereference per decrererne il conteggio dei riferimenti.
- Quando il puntatore a oggetti del volume non è più necessario, chiamare ObDereferenceObject per decrererne il conteggio dei riferimenti.
Un minifilter può modificare il valore del membro TargetFileObject . Tuttavia, il nuovo valore deve essere un puntatore a un oggetto file per un file che risiede nello stesso volume dell'istanza specificata dal membro TargetInstance .
Un minifilter non può modificare in modo sicuro il valore del membro MajorFunction . Deve invece avviare una nuova operazione di I/O.
Un minifilter può avviare un'operazione di I/O chiamando una routine di supporto, ad esempio FltReadFile o chiamando FltAllocateCallbackData per allocare una struttura di dati di callback; inizializzare i parametri di I/O nella struttura FLT_IO_PARAMETER_BLOCK e passare la struttura dei dati di callback a FltPerformSynchronousIo o FltPerformAsynchronousIo.
Nota
Usare le routine di supporto ovunque possibile quando si avviano operazioni di I/O. Un minifilter deve allocare i propri dati di callback solo se non esiste alcuna funzione di supporto per un'operazione di I/O specifica.
Requisiti
Intestazione | fltkernel.h (includere Fltkernel.h) |
Vedi anche
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_QUERY_VOLUME_INFORMATION