struttura FLT_IO_PARAMETER_BLOCK (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;
Membri
IrpFlags
Maschera di bit di flag che specificano vari aspetti dell'operazione di I/O. Questi flag vengono usati solo per le operazioni basate su IRP. Nella tabella seguente vengono illustrati i valori dei 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 operazioni di I/O libera il buffer durante la fase di completamento per IRP. |
IRP_INPUT_OPERATION | L'operazione è un'operazione di input. |
IRP_NOCACHE | L'operazione è un'operazione di I/O non memorizzata nella cache. |
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 paging sincrono di I/O. |
IRP_MOUNT_COMPLETION | Per l'operazione viene completato un montaggio del volume. |
IRP_CREATE_OPERATION | L'operazione è un'operazione di creazione o apertura. |
IRP_READ_OPERATION | L'operazione di I/O è destinata alla lettura. |
IRP_WRITE_OPERATION | L'operazione di I/O è destinata alla scrittura. |
IRP_DEFER_IO_COMPLETION | Il completamento di I/O dell'operazione viene posticipato. |
IRP_ASSOCIATED_IRP | L'operazione è associata a un IRP master. |
IRP_OB_QUERY_NAME | L'operazione è una query con nome asincrono. |
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 operazioni di callback del file system (FSFilter). Per altre informazioni sulle operazioni aggiuntive, vedere FLT_PARAMETERS.
MinorFunction
Codice della funzione secondaria 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 bit di flag che specificano vari aspetti dell'operazione di I/O. Questi flag vengono usati solo per le operazioni basate su IRP. Gestione filtri copia questi flag dal membro flag della struttura di IO_STACK_LOCATION associata al IRP. Nella tabella seguente vengono illustrati i valori di flag usati più di frequente.
Valore | Significato |
---|---|
SL_CASE_SENSITIVE | Utilizzato per IRP_MJ_CREATE. Se questo flag è impostato, i confronti dei nomi di file devono fare distinzione tra maiuscole e minuscole. |
SL_EXCLUSIVE_LOCK | Utilizzato per IRP_MJ_LOCK_CONTROL. Se questo flag è impostato, viene richiesto un blocco di intervallo di byte esclusivo. In caso contrario, viene richiesto un blocco condiviso. |
SL_FAIL_IMMEDIATELY | Utilizzato per IRP_MJ_LOCK_CONTROL. Se questo flag è impostato, la richiesta di blocco non riesce se non può essere concessa immediatamente. |
SL_FORCE_ACCESS_CHECK | Utilizzato 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 nelle aree del volume in cui normalmente sono bloccati dalla scrittura a causa di motivi di sicurezza. Questo flag viene controllato sia a livello di file system che di 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_EAe IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi delle informazioni relative a directory, quota o attributi estesi deve iniziare in corrispondenza della voce nell'elenco il cui indice è specificato. |
SL_OPEN_PAGING_FILE | Utilizzato per IRP_MJ_CREATE. Se questo flag è impostato, il file è un file di paging. |
SL_OPEN_TARGET_DIRECTORY | Utilizzato 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_READe IRP_MJ_WRITE. Se questo flag è impostato, l'operazione di I/O deve essere eseguita anche se il flag DO_VERIFY_VOLUME è impostato sull'oggetto dispositivo del volume. |
SL_RESTART_SCAN | Usato per IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EAe IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi delle informazioni sulla directory, la quota o l'attributo esteso deve 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_EAe IRP_MJ_SET_QUOTA. Se questo flag è impostato, l'analisi delle informazioni relative a directory, quota o attributi estesi deve restituire solo la prima voce trovata. |
SL_WATCH_TREE | Usato per IRP_MJ_DIRECTORY_CONTROL. Se questo flag è impostato, è necessario controllare anche tutte le sottodirectory di questa directory. In caso contrario, solo la directory stessa deve essere osservata. |
SL_WRITE_THROUGH | Usato per IRP_MJ_WRITE. Se questo flag è impostato, i dati del file devono essere scritti in una risorsa di archiviazione permanente, non solo scritta nella cache. |
Reserved
Riservato per l'uso del sistema. Non usare.
TargetFileObject
Puntatore a un oggetto file per il file o la directory di destinazione per questa operazione di I/O.
TargetInstance
Puntatore a un'istanza opaca per il minifiltro che rappresenta la destinazione per questa operazione di I/O.
Parameters
Struttura FLT_PARAMETERS che contiene i parametri per l'operazione di I/O specificata dall'MajorFunction e MinorFunction membri.
Osservazioni
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). La struttura dei dati di callback contiene un puntatore alla struttura FLT_IO_PARAMETER_BLOCK nel relativo membro Iopb.
Un minifilter riceve un puntatore alla struttura dei dati di callback come Data o CallbackData parametro di input 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 callback di preoperazione e postoperazione di un minifilter possono modificare il contenuto della struttura FLT_IO_PARAMETER_BLOCK per l'operazione di I/O, ad eccezione dei membri MajorFunction e membri riservati. In caso affermativo, deve chiamare FltSetCallbackDataDirty, a meno che non abbia modificato anche il IoStatus membro della struttura dei dati di callback per l'operazione. In caso contrario, i valori modificati vengono ignorati.
Quando Gestione filtri rilascia un callback di preoperazione o postoperazione a un minifiltro, FltObjects->FileObject e TargetFileObject (CallbackData->Iopb->TargetFileObject) sono inizialmente uguali. Se un minifiltro modifica TargetFileObject o TargetInstance, la successiva chiamata a FltSetCallbackDataDirty da un callback di preoperazione causerà la sostituzione di FltObjects->FileObject e FltObjects->instance prima di inviare l'operazione a filtri inferiori.
Se una routine di callback di preoperazione di un minifiltro modifica i parametri per un'operazione di I/O, tutti i minifiltri sotto di esso nello stack di istanze minifilter riceveranno i parametri modificati nelle routine di callback di preoperazione e postoperazione.
I parametri modificati non vengono ricevuti dalla routine di callback di postoperazione del minifilter o da eventuali minifiltri sopra il minifiltro nello stack di istanze del minifiltro. In tutti i casi, le routine di callback di preoperazione e postoperazione di un minifiltro ricevono gli stessi valori dei parametri di input.
Se un minifiltro modifica il valore del membro TargetInstance, il nuovo valore deve essere un puntatore a un'istanza dello stesso minifiltro alla 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 del volume, dato un puntatore a un'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 al volume non è più necessario, chiamare FltObjectDereference per decrementare il conteggio dei riferimenti.
- Quando il puntatore a oggetti del dispositivo del volume non è più necessario, chiamare ObDereferenceObject per decrementare il numero di riferimenti.
Un minifiltro 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 minifiltro non può modificare in modo sicuro il valore del membro MajorFunction. Deve invece avviare una nuova operazione di I/O.
Un minifiltro 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; inizializzazione dei parametri di I/O nella struttura FLT_IO_PARAMETER_BLOCK e passaggio della struttura dei dati di callback a FltPerformSynchronousIo o FltPerformAsynchronousIo.
Nota
Usare le routine di supporto laddove possibile quando si avviano operazioni di I/O. Un minifilter deve allocare i propri dati di callback solo se non è presente alcuna funzione di supporto per una determinata operazione di I/O.
Fabbisogno
Requisito | Valore |
---|---|
intestazione | fltkernel.h (include Fltkernel.h) |
Vedere anche
- FLT_PARAMETERS per IRP_MJ_ACQUIRE_FOR_MOD_WRITE
- FLT_PARAMETERS per IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS per IRP_MJ_CREATE
- FLT_PARAMETERS per IRP_MJ_CREATE_MAILSLOT
- FLT_PARAMETERS per IRP_MJ_CREATE_NAMED_PIPE
- FLT_PARAMETERS per IRP_MJ_DEVICE_CONTROL
- FLT_PARAMETERS per IRP_MJ_DIRECTORY_CONTROL
- FLT_PARAMETERS per IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE
- FLT_PARAMETERS per IRP_MJ_FILE_SYSTEM_CONTROL
- FLT_PARAMETERS per IRP_MJ_INTERNAL_DEVICE_CONTROL
- FLT_PARAMETERS per IRP_MJ_LOCK_CONTROL
- FLT_PARAMETERS per IRP_MJ_MDL_READ
- FLT_PARAMETERS per IRP_MJ_MDL_READ_COMPLETE
- FLT_PARAMETERS per IRP_MJ_MDL_WRITE_COMPLETE
- FLT_PARAMETERS per IRP_MJ_NETWORK_QUERY_OPEN
- FLT_PARAMETERS per IRP_MJ_PNP
- FLT_PARAMETERS per IRP_MJ_PREPARE_MDL_WRITE
- FLT_PARAMETERS per IRP_MJ_QUERY_EA
- FLT_PARAMETERS per IRP_MJ_QUERY_INFORMATION
- FLT_PARAMETERS per IRP_MJ_QUERY_OPEN
- FLT_PARAMETERS per IRP_MJ_QUERY_QUOTA
- FLT_PARAMETERS per IRP_MJ_QUERY_SECURITY
- FLT_PARAMETERS per IRP_MJ_QUERY_VOLUME_INFORMATION
- FLT_PARAMETERS per IRP_MJ_READ
- FLT_PARAMETERS per IRP_MJ_RELEASE_FOR_MOD_WRITE
- FLT_PARAMETERS per IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS per IRP_MJ_SET_EA
- FLT_PARAMETERS per IRP_MJ_SET_INFORMATION
- FLT_PARAMETERS per IRP_MJ_SET_QUOTA
- FLT_PARAMETERS per IRP_MJ_SET_SECURITY
- FLT_PARAMETERS per IRP_MJ_SET_VOLUME_INFORMATION
- FLT_PARAMETERS per IRP_MJ_SYSTEM_CONTROL
- FLT_PARAMETERS per IRP_MJ_VOLUME_MOUNT
- FLT_PARAMETERS per IRP_MJ_WRITE