修改 I/O 操作的参数

微筛选器驱动程序可以修改 I/O 操作的参数。 例如,微筛选器驱动程序的 预操作回调例程 可以通过更改操作的目标实例将 I/O 操作重定向到其他卷。 新的目标实例必须是另一卷上同一个高度处的同一微筛选器驱动程序的实例。

I/O 操作的参数位于回调数据 (FLT_CALLBACK_DATA ) 结构和 I/O 参数块 (操作FLT_IO_PARAMETER_BLOCK) 结构中。 微筛选器驱动程序的 预操作回调例程操作后回调例程 接收指向 Data 输入参数中操作的回调数据结构的指针。 回调数据结构的 Iopb 成员是指向包含操作参数的 I/O 参数块结构的指针。

如果微筛选器驱动程序的预操作回调例程修改 I/O 操作的参数,则微筛选器驱动程序实例堆栈中该微筛选器驱动程序下面的所有微筛选器驱动程序都将在其预操作和操作后回调例程中接收修改的参数。

当前微筛选器驱动程序的后操作回调例程或微筛选器驱动程序实例堆栈中该微筛选器驱动程序上方的任何微筛选器驱动程序不会接收修改的参数。 在所有情况下,微筛选器驱动程序的预操作和操作后回调例程接收给定 I/O 操作的相同输入参数值。

修改 I/O 操作的参数后,操作前或操作后回调例程必须通过调用 FltSetCallbackDataDirty 来指示它已执行此操作,除非它已更改回调数据结构的 IoStatus 字段的内容。 否则,筛选器管理器将忽略对参数值所做的任何更改。 FltSetCallbackDataDirty 在 I/O 操作的回调数据结构中设置FLTFL_CALLBACK_DATA_DIRTY标志。 微筛选器驱动程序可以通过调用 FltIsCallbackDataDirty 来测试此标志,也可以通过调用 FltClearCallbackDataDirty 来清除它。

如果微筛选器驱动程序的预操作回调例程修改 I/O 操作的参数,则微筛选器驱动程序实例堆栈中该微筛选器驱动程序下面的所有微筛选器驱动程序都将接收 DataFltObjects 输入参数中修改的参数,并将其预操作和操作后回调例程。 (微筛选器驱动程序无法直接修改 FltObjects 参数指向的 FLT_RELATED_OBJECTS 结构的内容。但是,如果微筛选器驱动程序修改 I/O 操作的目标实例或目标文件对象,筛选器管理器将修改传递给较低微筛选器驱动程序的FLT_RELATED_OBJECTS结构的相应 InstanceFileObject 成员的值。)

尽管微筛选器驱动程序的预操作回调例程所做的任何参数更改都不会由微筛选器驱动程序自己的操作后回调例程接收,但预操作回调例程能够将有关已更改参数的信息传递给微筛选器驱动程序自己的操作后回调例程。 如果预操作回调例程通过返回FLT_PREOP_SUCCESS_WITH_CALLBACK或FLT_PREOP_SYNCHRONIZE向下传递 I/O 操作,则它可以将有关更改的参数值的信息存储到 由 CompletionContext 输出参数指向的微筛选器驱动程序定义的结构中。 筛选器管理器将 CompletionContext 输入参数中的此结构指针传递给操作后回调例程。

有关 I/O 操作的参数的详细信息,请参阅 FLT_CALLBACK_DATAFLT_IO_PARAMETER_BLOCK