Compartilhar via


estrutura FLT_IO_PARAMETER_BLOCK (fltkernel.h)

A estrutura FLT_IO_PARAMETER_BLOCK contém os parâmetros para a operação de E/S representada por uma estrutura de dados de retorno de chamada FLT_CALLBACK_DATA.

Sintaxe

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;

Membros

IrpFlags

Uma máscara de bits de sinalizadores que especificam vários aspectos da operação de E/S. Esses sinalizadores são usados apenas para operações baseadas em IRP. A tabela a seguir mostra valores de sinalizador.

Valor Significado
IRP_BUFFERED_IO A operação é uma operação de E/S em buffer.
IRP_CLOSE_OPERATION A operação é uma operação de limpeza ou fechamento.
IRP_DEALLOCATE_BUFFER O Gerenciador de E/S liberará o buffer durante a fase de conclusão do IRP.
IRP_INPUT_OPERATION A operação é uma operação de entrada.
IRP_NOCACHE A operação é uma operação de E/S não armazenado em cache.
IRP_PAGING_IO A operação é uma operação de E/S de paginação.
IRP_SYNCHRONOUS_API A operação de E/S é síncrona.
IRP_SYNCHRONOUS_PAGING_IO A operação é uma operação de E/S de paginação síncrona.
IRP_MOUNT_COMPLETION Uma montagem de volume é concluída para a operação.
IRP_CREATE_OPERATION A operação é uma operação de criação ou abertura.
IRP_READ_OPERATION A operação de E/S é para leitura.
IRP_WRITE_OPERATION A operação de E/S é para gravação.
IRP_DEFER_IO_COMPLETION A conclusão de E/S da operação foi adiada.
IRP_ASSOCIATED_IRP A operação está associada a um IRP mestre.
IRP_OB_QUERY_NAME A operação é uma consulta de nome assíncrona.
IRP_HOLD_DEVICE_QUEUE Reservado.
IRP_UM_DRIVER_INITIATED_IO A operação foi originada de um driver de modo de usuário.

MajorFunction

O código de função principal para a operação de E/S. Os principais códigos de função são usados para operações baseadas em IRP, operações de E/S rápidas e operações de retorno de chamada do FSFilter (sistema de arquivos). Para obter mais informações sobre operações adicionais, consulte FLT_PARAMETERS.

MinorFunction

O código de função secundária para a operação de E/S. Esse membro é opcional e pode ser NULL. O valor do membro MajorFunction determina os valores possíveis. Para obter mais informações sobre códigos de função secundários, consulte FLT_PARAMETERS.

OperationFlags

Uma máscara de bits de sinalizadores que especificam vários aspectos da operação de E/S. Esses sinalizadores são usados apenas para operações baseadas em IRP. O Gerenciador de Filtros copia esses sinalizadores do membro Flags da estrutura IO_STACK_LOCATION associada ao IRP. A tabela a seguir mostra os valores de sinalizador mais usados.

Valor Significado
SL_CASE_SENSITIVE Usado para IRP_MJ_CREATE. Se esse sinalizador for definido, as comparações de nome de arquivo deverão diferenciar maiúsculas de minúsculas.
SL_EXCLUSIVE_LOCK Usado para IRP_MJ_LOCK_CONTROL. Se esse sinalizador for definido, um bloqueio de intervalo de bytes exclusivo será solicitado. Caso contrário, um bloqueio compartilhado será solicitado.
SL_FAIL_IMMEDIATELY Usado para IRP_MJ_LOCK_CONTROL. Se esse sinalizador estiver definido, a solicitação de bloqueio deverá falhar se não puder ser concedida imediatamente.
SL_FORCE_ACCESS_CHECK Usado para IRP_MJ_CREATE. Se esse sinalizador for definido, as verificações de acesso deverão ser executadas mesmo se o valor do membro RequestorMode do IRP for KernelMode.
SL_FORCE_DIRECT_WRITE Usado para IRP_MJ_WRITE e IOCTL_DISK_COPY_DATA. Se esse sinalizador for definido, os drivers de modo kernel poderão gravar em áreas de volume em que normalmente são impedidos de gravar devido a motivos de segurança. Esse sinalizador é verificado na camada do sistema de arquivos e na camada de pilha de armazenamento. O sinalizador SL_FORCE_DIRECT_WRITE está disponível no Windows Vista e em versões posteriores do Windows.
SL_INDEX_SPECIFIED Usado para IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se esse sinalizador estiver definido, a verificação de informações de diretório, cota ou atributo estendido deverá começar na entrada na lista cujo índice é especificado.
SL_OPEN_PAGING_FILE Usado para IRP_MJ_CREATE. Se esse sinalizador estiver definido, o arquivo será um arquivo de paginação.
SL_OPEN_TARGET_DIRECTORY Usado para IRP_MJ_CREATE. Se esse sinalizador estiver definido, o diretório pai do arquivo deverá ser aberto.
SL_OVERRIDE_VERIFY_VOLUME Usado para IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_READ e IRP_MJ_WRITE. Se esse sinalizador for definido, a operação de E/S deverá ser executada mesmo se o sinalizador DO_VERIFY_VOLUME estiver definido no objeto do dispositivo do volume.
SL_RESTART_SCAN Usado para IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se esse sinalizador estiver definido, a verificação de informações de diretório, cota ou atributo estendido deverá começar na primeira entrada no diretório ou na lista. Caso contrário, a verificação deverá ser retomada da verificação anterior.
SL_RETURN_SINGLE_ENTRY Usado para IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA e IRP_MJ_SET_QUOTA. Se esse sinalizador estiver definido, a verificação de informações de diretório, cota ou atributo estendido deverá retornar apenas a primeira entrada encontrada.
SL_WATCH_TREE Usado para IRP_MJ_DIRECTORY_CONTROL. Se esse sinalizador for definido, todos os subdiretórios desse diretório também deverão ser observados. Caso contrário, apenas o diretório em si deve ser observado.
SL_WRITE_THROUGH Usado para IRP_MJ_WRITE. Se esse sinalizador estiver definido, os dados do arquivo deverão ser gravados no armazenamento persistente, não apenas gravados no cache.

Reserved

Reservado para uso do sistema. Não use.

TargetFileObject

Um ponteiro de objeto de arquivo para o arquivo ou diretório que é o destino para esta operação de E/S.

TargetInstance

Um ponteiro de instância opaco para o minifiltro que é o destino para essa operação de E/S.

Parameters

Uma estrutura FLT_PARAMETERS que contém os parâmetros para a operação de E/S especificada pelos membros MajorFunction e MinorFunction .

Comentários

A estrutura FLT_IO_PARAMETER_BLOCK contém os parâmetros para a operação de E/S representada por uma estrutura de dados de retorno de chamada (FLT_CALLBACK_DATA). A estrutura de dados de retorno de chamada contém um ponteiro para a estrutura FLT_IO_PARAMETER_BLOCK em seu membro Iopb .

Um minifiltro recebe um ponteiro para a estrutura de dados de retorno de chamada como o parâmetro de entrada Data ou CallbackData para os seguintes tipos de rotina de retorno de chamada:

As rotinas de retorno de chamada de pré-operação e postoperation de um minifiltro podem modificar o conteúdo da estrutura FLT_IO_PARAMETER_BLOCK para a operação de E/S, exceto para os membros MajorFunction e Reserved . Se isso acontecer, ele deverá chamar FltSetCallbackDataDirty, a menos que também tenha modificado o membro IoStatus da estrutura de dados de retorno de chamada para a operação. Caso contrário, os valores modificados serão ignorados.

Quando o Gerenciador de Filtros emite um retorno de chamada de pré-operação ou postoperation para um minifiltro, FltObjects-FileObject> e TargetFileObject (CallbackData-Iopb-TargetFileObject>>) são inicialmente os mesmos. Se um minifiltro modificar TargetFileObject ou TargetInstance, sua chamada subsequente para FltSetCallbackDataDirty de um retorno de chamada de pré-operação fará com que o Gerenciador de Filtros substitua FltObjects-FileObject> e FltObjects-Instance antes de> enviar a operação para filtros inferiores.

Se a rotina de retorno de chamada de pré-operação de um minifiltro modificar os parâmetros de uma operação de E/S, todos os minifiltros abaixo dela na pilha de instâncias de minifiltro receberão os parâmetros modificados em suas rotinas de retorno de chamada de pré-operação e operação de operação.

Os parâmetros modificados não são recebidos pela própria rotina de retorno de chamada de postoperation do minifiltro ou por quaisquer minifiltros acima desse minifiltro na pilha de instâncias de minifiltro. Em todos os casos, as rotinas de retorno de chamada de pré-operação e postoperation de um minifiltro recebem os mesmos valores de parâmetro de entrada.

Se um minifiltro alterar o valor do membro TargetInstance , o novo valor deverá ser um ponteiro para uma instância do mesmo minifiltro na mesma altitude em um volume diferente. Além disso, o objeto de dispositivo do novo volume deve ter um tamanho de pilha maior ou igual ao do objeto de dispositivo do volume original.

Para obter o tamanho da pilha de um objeto de dispositivo de volume, dado um ponteiro de instância opaca para uma instância anexada ao volume, faça o seguinte:

  • Chame FltGetVolumeFromInstance para obter o ponteiro de volume.
  • Chame FltGetDeviceObject para obter um ponteiro para o objeto do dispositivo de volume. Esse ponteiro é retornado no parâmetro DeviceObject . O tamanho da pilha do objeto do dispositivo pode ser encontrado em DeviceObject-StackSize>.
  • Quando o ponteiro de volume não for mais necessário, chame FltObjectDereference para diminuir sua contagem de referência.
  • Quando o ponteiro do objeto do dispositivo de volume não for mais necessário, chame ObDereferenceObject para diminuir sua contagem de referência.

Um minifiltro pode alterar o valor do membro TargetFileObject . No entanto, o novo valor deve ser um ponteiro para um objeto de arquivo para um arquivo que reside no mesmo volume que a instância especificada pelo membro TargetInstance .

Um minifiltro não pode alterar com segurança o valor do membro MajorFunction . Em vez disso, ele deve iniciar uma nova operação de E/S.

Um minifiltro pode iniciar uma operação de E/S chamando uma rotina de suporte, como FltReadFile ou chamando FltAllocateCallbackData para alocar uma estrutura de dados de retorno de chamada; inicializar os parâmetros de E/S na estrutura FLT_IO_PARAMETER_BLOCK e passar a estrutura de dados de retorno de chamada para FltPerformSynchronousIo ou FltPerformAsynchronousIo.

Observação

Use rotinas de suporte sempre que possível ao iniciar operações de E/S. Um minifiltro deve alocar seus próprios dados de retorno de chamada somente se não houver nenhuma função de suporte para uma operação de E/S específica.

Requisitos

Requisito Valor
Cabeçalho fltkernel.h (inclua Fltkernel.h)

Confira também

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateCallbackData

FltClearCallbackDataDirty

FltDecodeParameters

FltIsCallbackDataDirty

FltReadFile

FltSetCallbackDataDirty

IO_STACK_LOCATION

IRP

FLT_PARAMETERS

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_SHUTDOWN

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_GENERATE_FILE_NAME

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK