Modificando os parâmetros de uma operação de E/S
Um driver de minifiltro pode modificar os parâmetros de uma operação de E/S. Por exemplo, a rotina de retorno de chamada de pré-operação de um driver de minifiltro pode redirecionar uma operação de E/S para um volume diferente alterando a instância de destino da operação. A nova instância de destino deve ser uma instância do mesmo driver de minifiltro na mesma altitude em outro volume.
Os parâmetros para uma operação de E/S são encontrados na estrutura de dados de retorno de chamada (FLT_CALLBACK_DATA) e na estrutura do bloco de parâmetros de E/S (FLT_IO_PARAMETER_BLOCK) para a operação. A rotina de retorno de chamada de pré-operação do driver de minifiltro e a rotina de retorno de chamada de postoperation recebem um ponteiro para a estrutura de dados de retorno de chamada para a operação no parâmetro de entrada de dados . O membro Iopb da estrutura de dados de retorno de chamada é um ponteiro para uma estrutura de bloco de parâmetros de E/S que contém os parâmetros para a operação.
Se a rotina de retorno de chamada de pré-operação de um driver de minifiltro modificar os parâmetros de uma operação de E/S, todos os drivers de minifiltro abaixo desse driver de minifiltro na pilha de instâncias do driver de minifiltro receberão os parâmetros modificados em suas rotinas de retorno de chamada de pré-operação e operação de postoperação.
Os parâmetros modificados não são recebidos pela rotina de retorno de chamada postoperation do driver de minifiltro atual ou por quaisquer drivers de minifiltro acima desse driver de minifiltro na pilha de instâncias do driver de minifiltro. Em todas as situações, as rotinas de retorno de chamada de pré-operação e de operação do driver de minifiltro recebem os mesmos valores de parâmetro de entrada para uma determinada operação de E/S.
Depois de modificar os parâmetros de uma operação de E/S, a rotina de retorno de chamada de pré-operação ou postoperation deve indicar que ela fez isso chamando FltSetCallbackDataDirty, a menos que tenha alterado o conteúdo do campo IoStatus da estrutura de dados de retorno de chamada. Caso contrário, o gerenciador de filtros ignorará as alterações nos valores de parâmetro. FltSetCallbackDataDirty define o sinalizador FLTFL_CALLBACK_DATA_DIRTY na estrutura de dados de retorno de chamada para a operação de E/S. Os drivers de minifiltro podem testar esse sinalizador chamando FltIsCallbackDataDirty ou desmarcá-lo chamando FltClearCallbackDataDirty.
Se a rotina de retorno de chamada de pré-operação de um driver de minifiltro modificar os parâmetros de uma operação de E/S, todos os drivers de minifiltro abaixo desse driver de minifiltro na pilha de instâncias do driver de minifiltro receberão os parâmetros modificados nos parâmetros de entrada Data e FltObjects para suas rotinas de retorno de chamada de pré-operação e operação. (Os drivers de minifiltro não podem modificar diretamente o conteúdo da estrutura FLT_RELATED_OBJECTS apontada pelo parâmetro FltObjects . No entanto, se um driver de minifiltro modificar a instância de destino ou o objeto de arquivo de destino para uma operação de E/S, o gerenciador de filtros modificará o valor do membro Instance ou FileObject correspondente da estrutura FLT_RELATED_OBJECTS que é passada para drivers de minifiltro inferiores.)
Embora quaisquer alterações de parâmetro feitas pela rotina de retorno de chamada de pré-operação de um driver de minifiltro não sejam recebidas pela própria rotina de retorno de chamada de postoperation do driver de minifiltro, uma rotina de retorno de chamada de pré-operação é capaz de passar informações sobre parâmetros alterados para a própria rotina de retorno de chamada do postoperation do driver de minifiltro. Se a rotina de retorno de chamada de pré-operação passar a operação de E/S para baixo na pilha retornando FLT_PREOP_SUCCESS_WITH_CALLBACK ou FLT_PREOP_SYNCHRONIZE, ela poderá armazenar informações sobre valores de parâmetro alterados em uma estrutura definida pelo driver de minifiltro que é apontada pelo parâmetro de saída CompletionContext . O gerenciador de filtros passa esse ponteiro de estrutura no parâmetro de entrada CompletionContext para a rotina de retorno de chamada postoperation.
Para obter mais informações sobre os parâmetros de uma operação de E/S, consulte FLT_CALLBACK_DATA e FLT_IO_PARAMETER_BLOCK.